题目链接:
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]);
}

这是一个关于POJ 3267问题的解析,题目要求在给定的文本串中删除最少字符,使其能由字典串表示。例如,文本串'browndcodw'删除两个'd'后变为'browncow',用字典中的'cow'和'brown'表示,答案为2。解决方案涉及动态规划,通过倒序遍历并模拟判断更新状态来求解。
346

被折叠的 条评论
为什么被折叠?



