题意:就是给出一个主串,和一本字典,问最少在主串删除多少字母,可以使其匹配到字典的单词序列。
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;
}