【poj 3267】The Cow Lexicon 题意&题解&代码(C++)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:
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]);   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值