POJ 3267 The Cow Lexicon

解题思路:DP

opt[i]表示到i为止最少需要除去多少字符

opt[i]=min{opt[i-1]+1,opt[j]+i-j-len[k]};
(if msg[i]==word[k][len[k]] && msg[j+1,i]包含word[k]);

 

NULL
#include <iostream>
using namespace std;

int main()
{
int i,j,k,t,w,r,l,len[600],opt[301]={0};
char msg[301],word[600][26];
scanf(
"%d %d", &w, &l);
scanf(
"%s", msg);
for(i=0;i<w;i++){scanf("%s", word[i]);len[i]=strlen(word[i]);}
for(i=1;i<=l;i++)
{
opt[i]
=opt[i-1]+1;
for (j=0;j<w;j++)
{
if(i<len[j]||msg[i-1]!=word[j][len[j]-1])continue;
for(k=i-1,t=len[j]-1;k>=0&&t>=0&&(i-k-len[j]+t)<opt[i];k--)
if(msg[k]==word[j][t])t--;
r
=t<0?(i-1-k-len[j]):i;
if(opt[k+1]+r<opt[i])opt[i]=opt[k+1]+r;
}
}
printf(
"%d\n",opt[l]);
return 0;
}

 

posted on 2010-12-23 13:20  ltang  阅读(257)  评论(0编辑  收藏  举报

导航