• USACO 2007 February Silver The Cow Lexicon /// DP oj24258


    题目大意:

    输入w,l; w是接下来的字典内的单词个数,l为目标字符串长度

    输入目标字符串

    接下来w行,输入字典内的各个单词

    输出目标字符串最少删除多少个字母就能变成只由字典内的单词组成的字符串

    Sample Input

    6 10
    browndcodw
    cow
    milk
    white
    black
    brown
    farmer

    Sample Output

    2

     
    当输入为
    2 6
    reader
    rad
    reder
    输出为
    1
    即单词不能相互覆盖 只能各自独立组合
    #include <algorithm>
    #include <cstring>
    #include <stdio.h>
    #include <string.h>
    #include <cstdio>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
        int w,l;
        while(~scanf("%d%d",&w,&l))
        {
            char ch[305],dic[605][30];
            scanf("%s",ch);
            for(int i=0;i<w;i++)
                scanf("%s",dic[i]);
            int dp[305];
            memset(dp,0,sizeof(dp));
            for(int i=0;i<l;i++) 
            { // 枚举结尾 再从各个单词尾部开始逐个向前对比
                dp[i+1]=dp[i]+1; 
                for(int j=0;j<w;j++) // 与字典中的各个单词对比
                {
                    int len=strlen(dic[j]);
                    int p=i,q=len-1; // p为主串的指向 q为当前字典单词的指向 
                    while(p>=0&&q>=0) /// 向前推至 单词匹配完 或 到达主串的开头
                    {
                        if(dic[j][q]==ch[p]) 
                            q--,p--; // 若可匹配 指向p q均前移
                        else p--; // 若不可 则主串指向p前移
                    }
                    if(q<0) dp[i+1]=min(dp[i+1],dp[p+1]+i-p-len); 
                    /// q<0 说明当前单词在主串具有匹配串 所以指向走到了0之前
                    
                    /// i-p 为主串指向的移动长度 len 为单词长度 
                    /// 差值 i-p-len 即为当前匹配串需删掉的字母个数
                    
                    /* 两者取小             
                                                dp[i] + 1 
                                    前i位最少删除个数 + 删除当前位 
                                    
                                              dp[p+1] + i-p-len 
                  (不含当前匹配串的)前p位最少删除个数 + (p之后的)当前匹配串中需删除个数 */
                  
                }
            }
            printf("%d
    ",dp[l]);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    用超穷归纳证明极大理想定理
    [shell]计算未知个数数据的平均值
    C中的野指针—如何避免
    [C#学习笔记02]理解值和引用
    vim编辑器的配置让你的代码更加易读
    mipslinuxgcc交叉编译工具链搭建小结
    Ubuntu 9.10下KScope的安装
    [uC/OSII]基本操作:新建任务,分配信号量
    基于Philips MF RC522的ISO14443A标准卡读写
    Git常用命令 shuo
  • 原文地址:https://www.cnblogs.com/zquzjx/p/8964791.html
Copyright © 2020-2023  润新知