poj 3267 The Cow Lexicon 动态规划

题目链接:http://poj.org/problem?id=3267

给一个字典

求原串中至少去掉多少个字母可以让已给字典可以完整覆盖原串

在跟字典作匹配时 注意原串是“可跳跃的” 即存在“删掉某个字母后 该字母的前后两部分拼起来组成单词”

针对这种情况 考虑使用两个指针

匹配时:同时往后滑1格

不匹配时:仅指向原串的指针往后滑1格

之所以网上大部分题解都是从原串的最后往前推

是因为这样写起来下标容易控制

最外层循环的原串从后往前 则匹配过程可以较自然地从前往后 而匹配过程明显更为复杂 所以这种写法有它的道理

pt1指向原串的字符位置

pt2指向字典中的单词的字符位置

状态转移方程:

在原串中没有以当前字符开头且可与字典匹配的单词时 dp[i] = dp[i+1]+1

在原串中有以当前字符开头且可与字典匹配的单词时 dp[i] = min(dp[i], dp[pt1] + (pt1 - i) - pt2) 不断更新 其中 “(pt1 - i) - pt2”表示为了得到匹配而删掉的字符数

这样dp[0]即为答案

这题也是本来有用string类 写着写着觉得没必要 就改掉了

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stack>
#include <set>
#include <queue>
#include <vector>

using namespace std;

const int maxlen = 320;
const int maxn = 610;

typedef struct
{
    char s[maxlen];
    int len;
}Node;

Node check[maxn];
char tmp[maxlen];
int dp[maxlen];
char a[maxn];

int main()
{
    //freopen("in.txt", "r", stdin);

    int w, l;
    scanf("%d%d", &w, &l);

    dp[l] = 0;

    scanf("%s", a);
    for(int i = 0; i < w; i++)
    {
        scanf("%s", tmp);
        strcpy(check[i].s, tmp);
        check[i].len = strlen(tmp);
    }

    for(int i = l-1; i >= 0; i--)
    {
        dp[i] = dp[i+1]+1;//先赋值过来 等后面不断更新
        bool flag = false;

        for(int t = 0; t < w; t++)
        {
            int tmplen = l - i + 1;

            if(check[t].len <= tmplen && check[t].s[0] == a[i])
            {
                int pt1 = i;//指向a
                int pt2 = 0;//指向check[i]

                while(pt2 < check[t].len && pt1 < l)
                {
                    if(check[t].s[pt2] == a[pt1])
                    {
                        pt1++;
                        pt2++;
                    }
                    else
                        pt1++;
                }

                if(pt2 == check[t].len)//表示完全匹配成功
                {
                    dp[i] = min(dp[i], dp[pt1] + (pt1 - i) - pt2);
                }
            }
        }
    }

    printf("%d\n", dp[0]);

    return 0;
}
时间: 2025-01-04 15:38:37

poj 3267 The Cow Lexicon 动态规划的相关文章

poj 3267 The Cow Lexicon (dp)

链接:poj 3267 题意:给定一个主串,和单词序列,问最少在主串删除多少字母, 可以使其匹配到单词序列,如 browndcodw cow milk white black brown farmer 删除主串中的两个d,brown和cow就与整个主串匹配了 分析:dp[i]表示从主串中第i个字符开始,到第L个字符(结尾处) 这段区间最少要删除的字符数, 则状态转移方程为: dp[i]=dp[i+1]+1  不能匹配时 dp[i]=min(dp[i],dp[pos]+pos-i-m)  可以匹配

POJ 3267 The Cow Lexicon

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10021   Accepted: 4814 Description Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their cowmunication sy

POJ #3267 The Cow Lexicon 型如&quot; E[j] = opt{D+w(i,j)} &quot;的简单DP 区间DP

Description 问题的描述以及输入输出的样例可以看这里:链接 思路 虽然 DISCUSS 中总有人说水题,但是我觉得这道题的质量可以 (或许我比较弱ORZ ,在做过的 DP 题里算 medium 难度. 题目的意思是给你一个主串和一堆子串,需要你将子串和主串完全匹配上,在匹配过程中可以删除主串中匹配不上的字符,最后统计出被删除的最少字符数目. 比如主串是 carmsr ,子串有 car .mr 两种.可以只用 car 去匹配,那么匹配不上的字符有 m.s.r 三个,所以需要删除三个字符:

POJ3267——The Cow Lexicon(动态规划)

The Cow Lexicon DescriptionFew know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their cowmunication system, based on mooing, is not very accurate; sometimes they hear word

POJ 3276 The Cow Lexicon DP-字符串匹配

点击打开链接 The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8325   Accepted: 3934 Description Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'.

【POJ 3267】 The Cow Lexicon

[POJ 3267] The Cow Lexicon 训练计划里把这题排到了topo里....然后我就这么死盯研究了一周topo算法(期间经历了三个人生风波....大物考试 高数考试跟模电考试----)啥不说了--上dp代码----没错 这是个dp!...赤果果的dp..就呢么傻呆呆地研究Topo算法--结果没研究出来.. 题意是给一个字符串和m个单词组成的字典,问最少删除几个字母能让这个字符串变成由字典中几个单词首位链接组成的字符串 dp思路还算好想 逆推 dp数组的下标是遍历字符串的起点 然

POJ 3267-The Cow Lexicon(DP)

The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8252   Accepted: 3888 Description Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their c

POJ 3267-The Cow Lexicon(dp_字符串)

The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8341   Accepted: 3941 Description Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their c

poj3267(The Cow Lexicon)

题目地址:The Cow Lexicon 题目大意: 奶牛有自己的识别单词的语言,它有自己的字典序列,如果给一串字符不符合奶牛的字典里的单词,奶牛就无法识别,你的任务就是找出给的字符串中包含给出奶牛字典的单词,至少从主串里删除几个字符,使主串只包含奶牛字典里的单词,不包含多于的字符. 解题思路: 动态规划dp. DP一直都不太懂,不看解题报告根本推不出来状态方程,入门水平都不够,需要好好练习学习该知识点. 状态方程: dp[i] i 代表从i到L最少需要删除的字符个数. 首先分为两种思想: 一是