The Cow Lexicon POJ - 3267 dp
阿新 • • 發佈:2019-01-12
題意 給出一個母串 和一個字典 問母串最少刪去幾個字母 刪去後的母串是由字典裡面的單詞拼起來的
思路:dp[i]表示從i到母串結尾最少需要刪除多少個字母 初始化dp[length]=0 最壞情況dp[i]=dp[i+1]+1
狀態轉移方程 dp[i]=min(dp[i],dp[p]+p-len-i) p 匹配單詞的最後一個位置 len是字典裡面單詞的長度 i是開始匹配的位置 p-len-i的意義就是匹配過程中刪除了多少個字母
參考:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122638.html
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 char s[305]; 6 char dir[605][305]; 7 int dp[1000]; 8 int main(){ 9 int w,l; 10 scanf("%d%d",&w,&l); 11 scanf("%s",s); 12 for(int i=0;i<w;i++){ 13 scanf("%s",dir[i]); 14 } 15 dp[l]=0; 16 for(int i=l-1;i>=0;i--){ 17 dp[i]=dp[i+1]+1; 18 for(int j=0;j<w;j++){ 19 int len=strlen(dir[j]); 20 int pm=0; 21 if(l-i+1>=len&&s[i]==dir[j][0]){ 22 int p2=i; 23 while(p2<l){ 24 if(dir[j][pm]==s[p2++]){ 25 pm++; 26 } 27 if(pm==len){ 28 dp[i]=min(dp[i],dp[p2]+p2-i-len); 29 break; 30 } 31 } 32 } 33 } 34 } 35 cout<<dp[0]<<endl; 36 return 0; 37 }