3267

1 /*
2 动态规划
3
4 这个题目我用了两个角度来考虑
5
6 起初的想法就是,f[i]表示到达i位置时,可匹配的最大字符数目
7
8 f[i] = max(f[i],f[x-len[word]]+len[word]);
9 也就是说,如果找到了一个word可以匹配,那么就是上面的状态方程了
10 最后的答案就是L-f[L];
11
12 然后看到大多人都是f[i]表示到达i可删除的最小字符数目
13
14 f[i] = min(f[i],f[x-len[word]]+i-is-len[word]);
15 is是word匹配的第一个字符的位置
16 然后最后的答案就是f[L]
17
18 两个方法都可以过,不知道哪个算正确的或者说都是正确的
19 */
20
21 // include file
22 #include <cstdio>
23 #include <cstdlib>
24 #include <cstring>
25 #include <cmath>
26 #include <cctype>
27 #include <ctime>
28
29 #include <iostream>
30 #include <sstream>
31 #include <fstream>
32 #include <iomanip>
33 #include <bitset>
34 #include <strstream>
35
36 #include <algorithm>
37 #include <string>
38 #include <vector>
39 #include <queue>
40 #include <set>
41 #include <list>
42 #include <functional>
43
44 using namespace std;
45
46 // typedef
47 typedef long long LL;
48 typedef unsigned long long ULL;
49 typedef __int64 Bint;
50
51 //
52 #define read freopen("in.txt","r",stdin)
53 #define write freopen("out.txt","w",stdout)
54 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
55 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
56 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
57 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
58 #define FORii(a,b,c) for(int ii=(a);ii<(b);ii+=c)
59 #define FORjj(a,b,c) for(int jj=(a);jj<(b);jj+=c)
60 #define FORkk(a,b,c) for(int kk=(a);kk<(b);kk+=c)
61
62 #define FF(i,a) for(int i=0;i<(a);i+++)
63 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
64 #define Z(a) (a<<1)
65 #define Y(a) (a>>1)
66
67 const double eps = 1e-6;
68 const double INFf = 1e10;
69 const int INFi = 1000000000;
70 const double Pi = acos(-1.0);
71
72 template<class T> inline T sqr(T a){return a*a;}
73 template<class T> inline T TMAX(T x,T y)
74 {
75 if(x>y) return x;
76 return y;
77 }
78 template<class T> inline T TMIN(T x,T y)
79 {
80 if(x<y) return x;
81 return y;
82 }
83 template<class T> inline void SWAP(T &x,T &y)
84 {
85 T t = x;
86 x = y;
87 y = t;
88 }
89 template<class T> inline T MMAX(T x,T y,T z)
90 {
91 return TMAX(TMAX(x,y),z);
92 }
93
94
95 // code begin
96 #define MAXN 610
97 int W,L;
98 char in[MAXN/2];
99 char dic[MAXN][28];
100 int len[MAXN];
101 int f[MAXN];
102 //f[i]以第i个字符结束
103
104 int main()
105 {
106 read;
107 write;
108 int r1,r2;
109 while(scanf("%d %d",&W,&L)!=-1)
110 {
111 scanf("%s",in);
112 FORi(0,W,1)
113 {
114 scanf("%s",dic[i]);
115 len[i] = strlen(dic[i]);
116 }
117
118 f[0] = 0;
119 FORi(1,L+1,1)
120 {
121 //f[i] = f[i-1]+1;
122 f[i] = f[i-1];
123 FORj(0,W,1)
124 {
125 if( len[j]<=i )
126 {
127 if( dic[j][len[j]-1]==in[i-1])
128 {
129 r1 = i-1;
130 r2 = len[j]-1;
131 while(r1>=0 && r2>=0)
132 {
133 if( dic[j][r2]==in[r1])
134 r2--;
135 r1--;
136 }
137 if(r2<0)
138 {//find it
139 if(r1<0)
140 {
141 //f[i] = TMIN(f[i],i-len[j]);
142 f[i] = TMAX(f[i],len[j]);
143 }
144 else
145 {
146 //f[i] = TMIN(f[i],i-1-r1-len[j] + f[r1+1]);
147 f[i] = TMAX(f[i],len[j]+f[r1+1]);
148 }
149 }
150 }
151 }
152 }
153 }
154
155 printf("%d\n",L-f[L]);
156 }
157 return 0;
158 }
posted @ 2011-03-10 14:48  AC2012  阅读(664)  评论(0编辑  收藏  举报