zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    初学Java——数组
    Ubuntu下将软件添加到快捷启动栏的问题
    初学Java——方法
    初学Java——选择
    初学Java——常用类之Math笔记
    初学Java——基本程序设计笔记(2)
    初学Java——基本程序设计笔记(1)
    关于IE浏览器里修改元素style属性的问题
    2.22,2.24工作进度
    2.21工作进度
  • 原文地址:https://www.cnblogs.com/zquzjx/p/8964791.html
Copyright © 2011-2022 走看看