一道很水的dp....不过本人dp实在是太烂了...
题意:问母串中至少去掉多少个字母才能是刚好由单词表中的一些单词连接而成的。
思路:dp[i]表示母串从第i位起始的后缀所对应的最少去掉字母数。
dp[i]有两种选择dp[i + 1] + 1,min{dp[i + w] + w - strlen(word[j])},1<=j<=n,其中num是从第i位开始匹配word[j]所需要的母串从i位起始的后缀的前缀的长度。
附代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define W 610
#define ss(str) scanf("%s",str);
#define sd(a,b) scanf("%d%d",&a,&b)
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
int dp[W],n,l;
char s[W],a[W][W];
void search(int p,int k)
{
int q=p+1,j=1,w=0;
while (j<strlen(a[k]))
{
while (s[q]!=a[k][j]&&q<l)
{
q++;w++;
}
if (q>=l) return;
j++;q++;
}
dp[p]=min(dp[p],dp[q]+w);
}
int main()
{
int i,j;
while (sd(n,l)!=EOF)
{
cl(dp);
ss(s);
for (i=1;i<=n;i++) ss(a[i]);
dp[l]=0;
for (i=l-1;i>=0;i--)
{
dp[i]=dp[i+1]+1;
for (j=1;j<=n;j++)
if (s[i]==a[j][0]) search(i,j);
}
cout<<dp[0]<<endl;
}
return 0;
}