poj 3267
题意:
问母串中至少去掉多少个字母才能是刚好由单词表中的一些单词连接而成的。
分析: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> #include<algorithm> #include<cmath> #include<stack> #include<map> #include<vector> #include<queue> using namespace std; #define mp make_pair const int INF=1000000000; const int N=300+9; int W,L; char s[N],w[N<<1][30]; int f[N]; int main() { scanf("%d%d",&W,&L); scanf("%s",s); for(int i=0;i<W;i++)scanf("%s",w[i]); for(int i=0;i<L;i++)f[i]=L-i; 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; }