题意:就是给出一个主串,和一本字典,问最少在主串删除多少字母,可以使其匹配到字典的单词序列。
PS:是匹配单词序列,而不是一个单词。
f[i]表示从message中第i个字符开始,到第L个字符(结尾处)这段区间所删除的字符数,初始化为f[L]=0
由于我的程序是从message尾部向头部检索匹配,所以是下面的状态方程:
1、f[i]=f[i+1]+1 不能匹配时(最坏情况)
2、f[i]=min(f[i],f[p]+(p-i)-q) 可以匹配时(取最优)
// Time 94ms; Memory 268K
#include<iostream> using namespace std; int main() { int w,l,i,j,p,q; char m[305],d[605][30]; int f[305]; cin>>w>>l; cin>>m; for(i=0;i<w;i++) cin>>d[i]; f[l]=0; for(i=l-1;i>=0;i--) { f[i]=f[i+1]+1; for(j=0;j<w;j++) if(m[i]==d[j][0]) { p=i;q=0; while(p<l) { if(m[p]==d[j][q]) { q++; if(d[j][q]==0) break; } p++; } if(p<l && f[i]>f[++p]+p-i-q) f[i]=f[p]+p-i-q; } } cout<<f[0]<<endl; return 0; }