POJ 3267 The Cow Lexicon

来源:互联网 发布:速达软件功能 编辑:程序博客网 时间:2024/05/18 20:46

题意:就是给出一个主串,和一本字典,问最少在主串删除多少字母,可以使其匹配到字典的单词序列。

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;}