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