POJ 3267 The Cow Lexicon

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

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


原文地址:https://www.cnblogs.com/java20130726/p/3218211.html