poj 3267 dp

来源:互联网 发布:js数组与字符串比较 编辑:程序博客网 时间:2024/05/18 00:09

题意:
问母串中至少去掉多少个字母才能是刚好由单词表中的一些单词连接而成的。
分析:
dp,f[i]表示母串从第i位起始的后缀所对应的最少去掉字母数。
f[i]有两种选择f[i + 1] + 1或者f[i + num] + num - strlen(word[j])。其中num是从第i位开始匹配word[j]所需要的母串从i位起始的后缀的前缀的长度。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=300+9;int W,L;char s[N],w[N<<1][30];int f[N];int main(){    //freopen("f.txt","r",stdin);    scanf("%d%d",&W,&L);    scanf("%s",s);    for(int i=0;i<W;i++)scanf("%s",w[i]);    f[L]=0;    for(int l=L-1;l>=0;l--){        f[l]=f[l+1]+1;        for(int i=0;i<W;i++){            int len=strlen(w[i]);            if(s[l]!=w[i][0])continue;            int k=l,t=0;            while(t<len&&k<L){                if(w[i][t]==s[k])t++,k++;                else k++;            }            if(t==len)f[l]=min(f[l],f[k]+k-l-len);        }    }    printf("%d\n",f[0]);    return 0;}
0 0
原创粉丝点击