锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓婇潰榪欐潯琛ㄨ揪寮忓嚭鏉ヤ箣鍚庡氨寰堝鏄撴兂鍒癓IS浜?jiǎn)锛屼篃灏辨槸鏋氫妇ai鍜宎i+1鐨勪綅緗紝鐒跺悗宸﹀崐閮ㄥ垎鍜屽張鍗婇儴鍒嗗垎鍒線鐩稿弽鐨勬柟鍚戝仛LIS錛屾眰鍑哄嚭鍒楁暟鏈鐭殑涓涓腑鐐瑰嵆鍙紝鍏朵腑鍋歀IS鍙互閲囩敤浜屽垎鏌ユ壘錛屼嬌寰楄漿縐昏姳璐逛粠O(n)闄嶄負(fù)O(lg n)銆?br> #include<cstdio>
2#include<cstring>
3#define inf 0x7fffffff
4#define N 1001
5#define MAX(a,b) (a<b)?b:a
6#define MIN(a,b) (a<b)?a:b
7using namespace std;
8int lis[N],lds[N];
9double w[N];
10
11int find(double c[],int len,double k)
{
12 int left=0,right=len,mid=(left+right)/2;
13 while(left<=right)
{
14 if( k>c[mid] ) left=mid+1;
15 else if( k<c[mid] ) right=mid-1;
16 else
{ return mid; }
17 mid=(left+right)/2;
18 }
19 return left;
20}
21
22int main()
{
23 int n,i,j,res;
24 int tmpDp[N];
25 double c[N];
26 while(scanf("%d",&n)!=EOF)
{
27 for(i=0;i<n;i++) scanf("%lf",&w[i]);
28
29 for(i=0;i<=n;i++) c[i]=inf;
30 c[0]=-1; c[1]=w[n-1];
31 memset(tmpDp,0,sizeof(tmpDp));
32 tmpDp[n-1]=1;
33 for(i=n-2;i>-1;--i)
{
34 j=find(c,n+1,w[i]);
35 c[j]=w[i]; tmpDp[i]=j;
36 }
37 for(j=-1,i=n-1;i>-1;--i)
{ j=MAX(j,tmpDp[i]); lds[i]=j; }
38
39 for(i=0;i<=n;i++) c[i]=inf;
40 c[0]=-1; c[1]=w[0];
41 memset(tmpDp,0,sizeof(tmpDp));
42 tmpDp[0]=1;
43 for(i=1;i<n;++i)
{
44 j=find(c,n+1,w[i]);
45 c[j]=w[i]; tmpDp[i]=j;
46 }
47 for(j=-1,i=0;i<n;++i)
{ j=MAX(j,tmpDp[i]); lis[i]=j; }
48
49 res=inf;
50 for(i=0;i<n;++i)
{
51 res=MIN(res,n-(lis[i]+lds[i+1]));
52 }
53 printf("%d\n",res);
54 }
55 return 0;
56}
]]>
Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their cowmunication system, based on mooing, is not very accurate; sometimes they hear words that do not make any sense. For instance, Bessie once received a message that said "browndcodw". As it turns out, the intended message was "browncow" and the two letter "d"s were noise from other parts of the barnyard.
The cows want you to help them decipher a received message (also containing only characters in the range 'a'..'z') of length L (2 ≤ L ≤ 300) characters that is a bit garbled. In particular, they know that the message has some extra letters, and they want you to determine the smallest number of letters that must be removed to make the message a sequence of words from the dictionary.
寮濮嬬殑鏃跺欒寰楀緢闅撅紝鍚庢潵浠旂粏鎬濊冧箣鍚庢墠鍙戠幇鍒囧叆鐐癸紝閲嶈鐨勮繕鏄湅鍑轟竴涓悎閫傜殑瀛愰棶棰橈紝鎬諱箣DP棰樼洰灝卞緱澶氱粌鎵嶈兘鍑虹溂鍏夈?br> 璁綿p[i]涓哄墠i涓瓧絎﹁漿涓哄悎娉曟墍闇鍒犻櫎鐨勫瓧姣嶄釜鏁幫紝閭d箞褰撴垜浠掓帹dp[i+1]鐨勬椂鍊欙紝瀹為檯涓婂氨鏄皾璇曞鎵句竴涓瓧鍏擱噷鐨勪覆錛屽畠涔熶互sourc[i+1]鏀跺熬(鏈夌殑鍋氭硶鏄互i瀛楁瘝鎵撳ご寰鍓嶆帹)錛岄偅涔堣繖鏃跺檇p[i+1]闇瑕佺煡閬撶殑灝辨槸 dp[i-(cnt+w[j])]澶勭殑緇撴灉錛宑nt+w[j]鏄掗鐨勯暱搴︼紝榪欎釜闀垮害鍖呭惈浜?jiǎn)鏌愪釜鍚堟硶涓查暱搴[j]鍜宑nt涓鍒犻櫎鐨勫瓧絎︼紝姝ゆ椂鎺ㄥ緱涓涓復(fù)鏃惰В錛屾墍鏈夊瓧鍏稿崟璇嶆帹鍑虹殑涓存椂瑙d腑鏈灝忕殑涓涓漿縐諱箣銆?br> 杞Щ鏂圭▼錛欴P[i]=Min{ DP[i] ,DP[i-(cnt+w[k])]+cnt ,DP[i-1]+1 }
緇欏畾涓涓艦寮忕殑澶╂灠錛屽ぉ鏋頒笂榪滅涓偣鐨勪笉鍚岃窛紱繪嫢鏈夐挬瀛愩傜粰瀹氬悇縐嶉噸閲忕牆鐮侊紝闂繀欏繪偓鎸傛墍鏈夌牆鐮佺殑鍓嶆彁涓嬶紝緇存寔澶╂灠騫寵 鐨勬寕娉曟暟涓哄灝戯紵
鏆村姏灝濊瘯鐨勬灇涓鵑噺鎯婁漢錛屾樉鐒跺嵆浣垮ぉ鏋板綋鍓嶄笉騫寵 錛屼絾瀹冪殑“涓嶅鉤琛″害”鏄彲浠ュ埄鐢ㄧ殑銆傚叧閿槸濡備綍璁捐DP鐘舵併傛櫘閬嶇殑鍋氭硶鏄互i涓墿鍝佷負(fù)闃舵錛岃綆楁?zhèn)寕鍒敖W琲涓墿鍝佹椂錛屽綋鍓嶅鉤琛″害杈懼埌v鐨勬柟娉曟繪暟銆傛槗寰?-7500<=v<=7500錛?dp[i][v]=鈭慸p[i-1][v-hoox[j]*w[i]] → dp[i][v+inf]=鈭慸p[i-1][v-hoox[j]*w[i]+inf]銆傚父鏁?inf 浠呬負(fù)淇濊瘉鏁扮粍涓嬫爣涓嶄負(fù)璐熴傛垜浠槑鏄懼彂鐜板畠鍦ㄥ艦寮忎笂綾諱技浜庤儗鍖呴棶棰橈紝絳変環(huán)浜庡湪v瀹硅儗鍖呬腑錛屽皾璇曟斁鍏ラ噸閲忎負(fù)hoox[j]*w[i]鐨勭墿鍝侊紝鎹㈠彇鏀剁泭涓縐嶆柟娉曘?/p>
瀹規(guī)槗鐞嗚В錛屽垵濮嬭В dp[0][0+inf]=1錛岀洰鏍囪В dp[m][0+inf] 銆?br>
綾繪瘮:
http://acm.ustc.edu.cn/ustcoj/problem.php?id=1116
DD鐗?<< 鑳屽寘涔?jié)璁?nbsp;>>
棰樼洰鎻忚堪
銆銆鍦ㄦ渤涓婃湁涓搴х嫭鏈ㄦˉ錛屼竴鍙潚铔欐兂娌跨潃鐙湪妗ヤ粠娌崇殑涓渚ц煩鍒板彟涓渚с傚湪妗ヤ笂鏈変竴浜涚煶
瀛愶紝闈掕洐寰堣鍘岃俯鍦ㄨ繖浜涚煶瀛愪笂銆傜敱浜庢ˉ鐨勯暱搴﹀拰闈掕洐涓嬈¤煩榪囩殑璺濈閮芥槸姝f暣鏁幫紝鎴戜滑鍙?br>浠ユ妸鐙湪妗ヤ笂闈掕洐鍙兘鍒拌揪鐨勭偣鐪嬫垚鏁拌醬涓婄殑涓涓叉暣鐐癸細(xì)0錛?錛?#8230;…錛孡錛堝叾涓璍鏄ˉ鐨勯暱搴︼級(jí)銆?br>鍧愭爣涓?鐨勭偣琛ㄧず妗ョ殑璧風(fēng)偣錛屽潗鏍囦負(fù)L鐨勭偣琛ㄧず妗ョ殑緇堢偣銆傞潚铔欎粠妗ョ殑璧風(fēng)偣寮濮嬶紝涓嶅仠鐨勫悜緇堢偣
鏂瑰悜璺寵穬銆備竴嬈¤煩璺冪殑璺濈鏄疭鍒癟涔嬮棿鐨勪換鎰忔鏁存暟錛堝寘鎷琒,T錛夈傚綋闈掕洐璺沖埌鎴栬煩榪囧潗鏍囦負(fù)L
鐨勭偣鏃訛紝灝辯畻闈掕洐宸茬粡璺沖嚭浜?jiǎn)鐙湪妗ャ?/p>
銆銆棰樼洰緇欏嚭鐙湪妗ョ殑闀垮害L錛岄潚铔欒煩璺冪殑璺濈鑼冨洿S,T錛屾ˉ涓婄煶瀛愮殑浣嶇疆銆備綘鐨勪換鍔℃槸紜畾
闈掕洐瑕佹兂榪囨渤錛屾渶灝戦渶瑕佽俯鍒扮殑鐭沖瓙鏁般?/p>
銆銆瀵逛簬鍏ㄩ儴鐨勬暟鎹紝L <= 10^9銆?/p>
杈撳叆鏍煎紡
銆銆杈撳叆鐨勭涓琛屾湁涓涓鏁存暟L錛? <= L <= 10^9錛夛紝琛ㄧず鐙湪妗ョ殑闀垮害銆傜浜岃鏈変笁涓?br>姝f暣鏁癝錛孴錛孧錛屽垎鍒〃紺洪潚铔欎竴嬈¤煩璺冪殑鏈灝忚窛紱伙紝鏈澶ц窛紱伙紝鍙?qiáng)妗ヤ笂鐭冲瓙鐨勪釜鏁板Q屽叾涓?br>1 <= S <= T <= 10錛? <= M <= 100銆傜涓夎鏈塎涓笉鍚岀殑姝f暣鏁板垎鍒〃紺鴻繖M涓煶瀛愬湪鏁?br>杞翠笂鐨勪綅緗紙鏁版嵁淇濊瘉妗ョ殑璧風(fēng)偣鍜岀粓鐐瑰娌℃湁鐭沖瓙錛夈傛墍鏈夌浉閭?cè)潥勬暣鏁颁箣闂寸敤涓涓┖鏍奸殧寮銆?/p>
杈撳嚭鏍煎紡
銆銆杈撳嚭鍙寘鎷竴涓暣鏁幫紝琛ㄧず闈掕洐榪囨渤鏈灝戦渶瑕佽俯鍒扮殑鐭沖瓙鏁般?/p>
鏍蜂緥杈撳叆
10
2 3 5
2 3 5 6 7
鏍蜂緥杈撳嚭
2
鍒嗘瀽錛?/p>
棣栧厛娉ㄦ剰涓嬫暟鎹噺錛宮axL=10^9錛岃繖鏄竴涓嵆浣挎槸綰挎х畻娉曚篃宸茬粡閫艱繎榪愯鏃墮檺鐨勮妯°?br>鎵浠ヨ鍑嗗濂借繘琛屾瀬闄愪紭鍖栥?br> 鏄捐屾槗瑙侊紝鏈綰湸鐨勬兂娉曟槸灝濊瘯鎼滅儲(chǔ)錛屼粠涓涓偣鎵╁睍鍑烘墍鏈夊彲鑳借煩鍒扮殑鐐癸紝渚濇綾繪帹錛?br>鏈鍚嶥FS瀵繪壘鐢遍《鑷充笅緇忚繃鐭沖瓙鏈灝戠殑璺緞鍗沖彲銆備絾娉ㄦ剰鍒版爲(wèi)鐨勫搴︽湁鍙兘杈懼埌maxJump=10錛?br>娣卞害涔熷拰L鎴愭姣旓紝鏁呰洰鍔涙悳绱笉鐜板疄銆?br> 鍙笉鍙互榪涜浼樺寲鍛紵鎴戜滑娉ㄦ剰鍒幫紝DFS鏁堢巼浣庝笅鐨勪竴涓緢閲嶈鍘熷洜鏄紝閫掑綊閬嶅巻鐨勮礬
寰勬湁璁稿嬈″叾瀹炴槸鍚屼竴鏉¤礬寰勶紝榪欎簺閲嶅宸ヤ綔娑堣椾簡(jiǎn)澶鏃墮棿銆備簬鏄垜浠嚜鐒惰岀劧鎯沖埌瑕佸
鎵捐蹇嗗寲鐨勭畻娉曘?br> 鎴戜滑鍙戠幇錛岃繖涓棶棰樺疄闄呬笂鍖呭惈鏈浼樺瓙緇撴瀯錛屽彧瑕侀潚铔欒兘绔欏湪鏌愪竴涓綅緗紝浠ュ畠鐨勬櫤鍟?br>緇濆浼?xì)浠庡墠闈涓彲鑳界殑浣嶇疆涓紝瀵繪壘榪欎箞涓涓綅緗紝榪欎釜浣嶇疆鎵澶勫湪鐨勮煩璺冭礬寰勪笂鎵緇忚繃鐨?br>鐭沖瓙鏄渶灝戠殑錛屼粠榪欎釜浣嶇疆璺寵穬鑰屾潵銆傛樉鐒?dòng)灱寴q欎釜鎬ц川鏄掑綊瀹氫箟鐨勩?棰濆鐨勶紝鎴戜滑鐪嬪埌錛?br>褰撻潚铔欑珯鍦ㄦ煇鏉¤礬寰勪笂鐨勬煇涓綅緗紝閭d箞瀹冩鍚庤煩璺冪殑璺緞錛堝綋鐒舵槸鍙兘鐨勮礬寰勶級(jí)鐨勯夋嫨騫?br>涓嶅彈涔嬪墠鐨勭粨鏋滄墍騫叉秹錛屽洜姝ら棶棰樺叿澶囨棤鍚庢晥鎬с?br>
鍙互鍔ㄨ浜?jiǎn)锛屼笅闈㈢洿鎺ゾl欏嚭杞Щ鏂圭▼銆?nbsp;
DP[n]=min{DP[k]|n-maxJump<=k<=n-minJump}+t
t=0||t=1
鍗籌紝璁句竴涓綅緗彲浠ュ埌杈撅紝閭d箞蹇呬粠鍓嶉潰鍙兘鐨勪綅緗夋嫨涓涓紝璇ヤ綅緗墍澶勭殑璺緞涓婄粡
榪囩煶瀛愭渶灝戙傝嫢褰撳墠浣嶇疆鏈夌煶瀛愶紝dp緇撴灉鍐嶅姞涓銆?br> 榪欐槸涓涓狾(n)鐨勯『鎺紝浣嗘槸錛屽鏋渕inJump-maxJump=1-10錛屽父鏁癈灝變細(xì)澶ぇ閫犳垚瓚呮椂銆傝兘
涓嶈兘鍐嶄紭鍖栧憿錛熶粩緇嗚瀵燂紝鍙戠幇鐭沖瓙鏈澶氭湁100綺掞紝鍦ㄦ暣涓?0^9闀垮害涓垎甯冪浉褰撶█鐤忥紝榪欐槸涓
涓緢閲嶈鐨勭壒鐐癸紒鍋囪 minJuump!=maxJump錛岄偅涔堣嫢絀虹櫧浣嶇疆瓚沖闀匡紝dp鐨勭粨鏋滄渶緇堥兘浼?xì)瓒?br>鍚戜簬涓涓ǔ瀹氬鹼紝榪欎釜鍊兼槸鍓嶉潰鎵鏈夊彲鑳界殑dp緇撴灉涓渶灝忕殑閭d釜(璇瘋鑰呰嚜宸辨兂璞★紝鑻ヨ煩璺冪殑
姝ラ暱鍙互閫夋嫨錛屽嵆璺沖埌鏌愪釜浣嶇疆鐨勮搗璺崇偣鍙互閫夋嫨鐨勮瘽錛屽湪瓚沖榪滅殑鏈潵錛屼竴涓仾鏄庣殑闈掕洐
鑲畾浼?xì)鍦ㄤ竴鏉℃渶浼樼殑璺緞涓婂眮棰犵潃~ 姹?銆?/p>
渚嬪鍦ㄨ繖涓鏁版嵁
25
4 5 5
2 3 5 6 7
0~4浣嶇疆鐨勫垵濮媎p鎸囦緷嬈′負(fù) [0,0,1,1,0]錛屽畠?yōu)畣鏈夊涓嬪彉鍖栧Q屽茍涓旇秼浜庣ǔ瀹氬?錛?/p>
(0~5)=[0,0,1,1,0,1]
(1~6)=[0,1,1,0,1,1]
(2~7)=[1,1,0,1,1,1]
(3~8)=[1,0,1,1,1,0]
(4~9)=[0,1,1,1,0,0]
(5~10)=[1,1,1,0,0,2]
(6~11)=[1,1,0,0,2,2]
(7~12)=[1,0,0,2,2,0]
(8~13)=[0,0,2,2,0,0]
(9~14)=[0,2,2,0,0,0]
(10~15)=[2,2,0,0,0,2]
(11~16)=[2,0,0,0,2,0]
(12~17)=[0,0,0,2,0,0]
(13~18)=[0,0,2,0,0,0]
(14~19)=[0,2,0,0,0,0]
(15~20)=[2,0,0,0,0,0]
......
涓轟簡(jiǎn)鍒╃敤榪欎釜鎬ц川錛屾垜浠厛紜畾瑕佷嬌鐢ㄧ殑鏁版嵁緇撴瀯銆傛樉鑰屾槗瑙佺殑錛屽絎琲涓綅緗殑璁$畻錛?br>鍙緷璧栦簬璺濈i涓瀹氳窛紱葷殑鏁頒釜宸茬煡緇撴灉銆傚洜姝わ紝鎴戜滑鍙渶鍏沖績(jī)鐩稿鍧愭爣鍗沖彲錛屼簬鏄嬌鐢ㄩ槦鍒?br>淇濆瓨i涔嬪墠涓瀹氳窛紱誨唴鐨刣p緇撴灉錛岃綆楀畬姣曞悗 dp[i-maxJump] 鍑洪槦錛宒p[i]鍏ラ槦錛屽啀鍒╃敤璇ラ槦
鍒楄綆梔p[i+1]錛屽姝ゅ線澶嶅驚鐜?br> 鐜板湪鍥炲埌涔嬪墠鐨勮璁猴紝褰撲竴涓槦鍒椾腑鐨勭粨鏋滃凡緇忚揪鍒扮ǔ鎬侊紝閭d箞瀵逛笅涓嬈¤綆楋紝瀹冨彧鑳戒駭
鐢熶袱縐嶇粨鏋滐細(xì)濡傛灉璁$畻浣嶇疆娌℃湁鐭沖瓙錛岄偅涔堥槦鍒椾粛鐒朵繚鎸佺ǔ瀹氾紱濡傛灉鏈夌煶瀛愶紝閭d箞鍔犱竴鐨勭粨鏋?br>灝嗕嬌寰楅槦鍒楀啀嬈″嚭鐜頒笉紼沖畾銆?澶氫箞浠や漢鎸鐨勭粨璁猴紒
榪欐剰鍛崇潃浠涔堝憿錛熻繖鎰忓懗鐫褰撲綘鍙戠幇闃熷垪宸茬粡榪涘叆紼沖畾鐨勬椂鍊欙紝鍚庨潰鎵鏈夊涓嶅瓨鍦ㄧ煶瀛愮殑
浣嶇疆榪涜鐨勮綆楅兘鏄彲浠ュ拷鐣ョ殑錛屼綘涓嶅Θ鐩存帴璁$畻鍒頒笅涓涓湭璁塊棶鐨勪笖鏈夌煶瀛愮殑浣嶇疆鍗沖彲銆?br> 寰堝浜哄凡緇忕湅鍒頒簡(jiǎn)錛岃繖鏄竴涓姸鎬佸帇緙?DP鐨勫仛娉曘?br>
綆楁硶緇堟: 1.dp宸茶綆楀畬鎵鏈夌煶瀛愬茍涓旂粨鏋滆繘鍏ョǔ瀹氭?br> 2. 闃熷垪宸茬粡紼沖畾騫朵笖涓嬩竴涓惤鍦扮殑浣嶇疆鎵鏈夊彲鑳界殑璧風(fēng)偣閮藉湪妗ョ殑緇堢偣鎴栦箣澶?br>
璇昏呭彲浠ヨ嚜琛屽垎鏋愪腑姝㈢殑鏉′歡錛屽墿涓嬬殑鍙渶瑕佽冭檻緇嗚妭闂灝卞彲浠ヤ簡(jiǎn)錛屽彧瑕佹濊礬娓呮櫚鏈?br>棰樺氨涓嶄細(xì)澶毦榪囥傜畻娉曠殑瀹為檯榪愯鏁堢巼娌℃湁闂錛屽崟涓瀬闄愭暟鎹彧娑堣椾簡(jiǎn)45ms銆?/p>
鏈鎹榪樻湁鍏朵粬瑙f硶錛屼緥濡傛暟瀛﹁鐐廣佹渶鐭礬瑙傜偣絳夛紝鎰熷叴瓚g殑鍙互google涓嬨?br> 涓嬮潰緇欏嚭綆楁硶鐨刴ain鍑芥暟妗嗘灦.
int main(){
scanf("%d%d%d%d",&l,&s,&t,&m);
for(step=0;step<m;step++)
scanf("%d",&stone[step]);
qsort(stone,m,sizeof(stone[0]),cmp);
_que=(Queue)CreatNewQueue;
for(step=0;step<t;step++) Enqueue(_que,0); //鍒濆鍖朌P闃熷垪
result=0;
stepTotal=0;
stepStone=-1;
if(s!=t){
while(1){
if(IsStran(_que)){
if(stepTotal-t>=l||stepStone==m-1) break;
stepStone++;
stepTotal=stone[stepStone];
}
else
stepTotal++;
DPCompute(_que,stepTotal,stone);
}
result=_que->head->dpS;
}
else{
// 褰搒=t 鏃跺叾瀹炰粛鐒剁鍚堣漿縐繪柟紼嬬殑瀹氫箟錛屼絾綆鍗曡搗瑙佸啓鎴愪簡(jiǎn)濡備笅褰㈠紡
for(step=0;step<m;step++)
if(stone[step]%s==0) result++;
}
printf("%d\n",result);
return 0;
}