题目链接:
http://poj.org/problem?id=3267
题意:
给出一个长度为L的文本串,在给出w个字典串,问最少在文本串中删除几个字符之后可以使得文本串可以用字典串表示出来。
样例解释:
6 10 (w=6,L=10)
browndcodw (文本串)
cow
milk
white
black
brown
farmer
将文本串中两个d删除后字符串变为 browncow ,此时可以用第1和第5个字符串表示文本串,答案是2
题解:
dp[i]表示从i到L之间需要删除多少个字符才能被表示出来,然后倒着for加模拟判断能否更新dp的值,具体看
http://blog.youkuaiyun.com/lyy289065406/article/details/6648121
其实感觉dp[i]表示从0到i之间要删除多少各字符才能被表示也能做。。但没试过。。。
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,l,len[605],dp[305];
char s[605][30],t[305];
int main()
{
scanf("%d%d",&n,&l);
scanf("%s",t);
for (int i=1;i<=n;i++)
{
scanf("%s",s[i]);
len[i]=strlen(s[i]);
}
dp[l]=0;
for (int i=l-1;i>=0;i--)
{
dp[i]=dp[i+1]+1;
for (int k=1;k<=n;k++)
{
int p1=i,p2=0;
if (len[k]>l-i) continue;
if (t[p1]!=s[k][p2]) continue;
while(p1<l && p2<len[k])
{
if (t[p1]!=s[k][p2])
p1++;
else
p1++,p2++;
}
if (p2==len[k]) dp[i]=min(dp[i],dp[p1]+(p1-i)-len[k]);
}
}
printf("%d\n",dp[0]);
}