poj3276

一维的dp

View Code
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 string dict[600];
 5 int dp[301];
 6 #define min(a,b) (a<b)?a:b
 7 int main()
 8 {
 9     int W,L;
10     int pd,pm;
11     string msg;
12     cin>>W>>L;
13     cin>>msg;
14     for(int i=0;i<W;i++)
15         cin>>dict[i];
16     dp[L]=0;
17     for(int i=L-1;i>=0;i--)
18     {
19         dp[i]=dp[i+1]+1;
20         for(int j=0;j<W;j++)
21         {
22             pd=0;pm=i;
23             int len=dict[j].length();
24             //match
25             if(len<=L-i && msg[i]==dict[j][0]){
26                 while(pm<L){
27                 if(msg[pm++]==dict[j][pd])
28                     pd++;
29                 if(pd==len){   //i~pm match dict[j]
30                     dp[i]=min(dp[i],dp[pm]+(pm-i)-len);
31                     break;
32                 }
33                 }
34             }
35         }
36     }
37     cout<<dp[0]<<endl;
38     return 0;
39 }

 

posted @ 2012-10-19 20:08  sidereal  Views(137)  Comments(0)    收藏  举报