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)  可以匹配时

pos-i-m 从主串的第i个字符到第pos个字符匹配了长度为m的单词应删除的字符数

初始化 dp[L]=0,最后输出 dp[0]即可

#include<stdio.h>
#include<string.h>
#define min(a,b) a<b?a:b
int main()
{
    int dp[3050],L,n,m,i,j,k,pos;
    char s[305],word[605][30];
    scanf("%d%d",&n,&L);
    scanf("%s",s);
    for(i=0;i<n;i++)
        scanf("%s",word[i]);
    dp[L]=0;
    for(i=L-1;i>=0;i--){
        dp[i]=dp[i+1]+1;  //假设不能匹配
        for(j=0;j<n;j++){
            m=strlen(word[j]);
            if(L-i>=m&&s[i]==word[j][0]){  //如果i到L间的长度至少为m,且第一个字符匹配
                pos=i;
                k=0;
                while(pos<L){
                    if(s[pos++]==word[j][k]) //如果该字符匹配,再匹配下一个字符
                        k++;
                    if(k==m){
                        dp[i]=min(dp[i],dp[pos]+pos-i-m); //如果匹配取最优解
                        break;
                    }
                }
            }
        }
    }
    printf("%d\n",dp[0]);
    return 0;
}
时间: 2024-12-14 10:47:35

poj 3267 The Cow Lexicon (dp)的相关文章

[luoguP2875] [USACO07FEB]牛的词汇The Cow Lexicon(DP)

传送门 f[i] 表示前 i 个字符去掉多少个 的最优解 直接暴力DP ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 int n, m, cnt, f[301]; 6 char s[301], a[601][26]; 7 8 inline int read() 9 { 10 int x = 0, f = 1; 11 char ch = getchar(); 12 for(;

【POJ 1191】 棋盘分割(DP)

[POJ 1191] 棋盘分割(DP) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13811   Accepted: 4917 Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分

poj - 1953 - World Cup Noise(dp)

题意:n位长的01序列(0 < n < 45),但不能出现连续的两个1,问序列有多少种. 题目链接:http://poj.org/problem?id=1953 -->>设dp[i][j]表示前 i 位中第 i 位为 j 时的序列数,则状态转移方程为: dp[i][0] = dp[i - 1][0] + dp[i - 1][1]; dp[i][1] = dp[i - 1][0]; 因为对于相同的n,其结果是固定的,所以可以对一个n只计算一次,然后记住她.. #include <

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 三个,所以需要删除三个字符:

poj 1964 Cow Cycling(dp)

/* 一开始想的二维的 只维护第几只牛还有圈数 后来发现每只牛的能量是跟随每个状态的 所以再加一维 f[i][j][k]表示第i只牛 领跑的j全 已经消耗了k体力 转移的话分两类 1.换一只牛领跑 那么就从f[i][j][k]转移到f[i+1][j][j] 2.不换 那就枚举i领跑几圈l f[i][j-l][k-l*l]转移到f[i][j][k] 时间++ */ #include<iostream> #include<cstdio> #include<cstring>

poj 3267 The Cow Lexicon 动态规划

题目链接:http://poj.org/problem?id=3267 给一个字典 求原串中至少去掉多少个字母可以让已给字典可以完整覆盖原串 在跟字典作匹配时 注意原串是“可跳跃的” 即存在“删掉某个字母后 该字母的前后两部分拼起来组成单词” 针对这种情况 考虑使用两个指针 匹配时:同时往后滑1格 不匹配时:仅指向原串的指针往后滑1格 之所以网上大部分题解都是从原串的最后往前推 是因为这样写起来下标容易控制 最外层循环的原串从后往前 则匹配过程可以较自然地从前往后 而匹配过程明显更为复杂 所以这

poj 3617 Best Cow Line(贪心)

 Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8579   Accepted: 2629 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges h

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 - 1050 - To the Max(dp)

题意:一个N * N的矩阵,求子矩阵的最大和(N <= 100, -127 <= 矩阵元素 <= 127). 题目链接:http://poj.org/problem?id=1050 -->>将二维压缩为一维,对一维进行dp求解. 将二维压缩成一维: 1.第1行 2.第2行加第1行 3.第3行加第2行加第1行 -- N.第N行加第N-1行加--加第1行 1.第2行 2.第3行加第2行 -- 1.第N行 对于一维情况,设dp[i]表示以第i个元素结尾的最大连续和,则状态转移方程为