poj3267The Cow Lexicon(dp)
7404 ワード
http://poj.org/problem?id=3267
dpに対して研究していないで問題の報告を見てやはり比較的に押しやすいdp[i]=min{dp[i]-1を見て、dp[j]+i-j-length[k]}Jからiまで辞書の中の単語を含みます
View Code
dpに対して研究していないで問題の報告を見てやはり比較的に押しやすいdp[i]=min{dp[i]-1を見て、dp[j]+i-j-length[k]}Jからiまで辞書の中の単語を含みます
View Code
1 #include <iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 char word[650][30];
7 int main()
8 {
9 int i,j,k,n,m,dp[310],kk[610];
10 char str[310];
11 while(cin>>n>>m)
12 {
13 cin>>str;
14 memset(dp,0,sizeof(dp));
15 for(i = 1; i <= n; i++)
16 {
17 cin>>word[i];
18 kk[i] = strlen(word[i]);
19 }
20 for(i = 0 ; i < m ; i++)
21 {
22 int mi = 1000;
23 if(i>0)
24 dp[i] = dp[i-1]+1;
25 else
26 dp[i] = 1;
27 for(j = 1 ; j <= n ; j++)
28 {
29 int g = kk[j]-1,tk = i;
30 while(tk>=0&&g>=0&&(i-tk+1-kk[j])<dp[i])
31 {
32 if(str[tk]==word[j][g])
33 g--;
34 tk--;
35 }
36 if(tk<0)
37 tk = 0;
38 if(g<0)
39 {
40 mi = min(mi,i-tk-kk[j]+dp[tk]);
41 }
42 else
43 mi = min(mi,i-tk+dp[tk]);
44 }
45 if(mi!=1000)
46 dp[i] = min(dp[i],mi);
47 }
48 cout<<dp[m-1]<<endl;
49 }
50 return 0;
51 }