1. 程式人生 > >The Cow Lexicon POJ - 3267 dp

The Cow Lexicon POJ - 3267 dp

  題意  給出一個母串  和一個字典 問母串最少刪去幾個字母     刪去後的母串是由字典裡面的單詞拼起來的

  思路: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 }