zoukankan      html  css  js  c++  java
  • poj 3267

    题意:

    问母串中至少去掉多少个字母才能是刚好由单词表中的一些单词连接而成的。

    分析:dp,f[i]表示母串从第i位起始的后缀所对应的最少去掉字母数。

    f[i]有两种选择f[i + 1] + 1或者f[i + num] + num - strlen(word[j])。其中num是从第i位开始匹配word[j]所需要的母串从i位起始的后缀的前缀的长度。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<stack>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define mp make_pair
    const int INF=1000000000;
    const int N=300+9;
    int W,L;
    char s[N],w[N<<1][30];
    int f[N];
    int main()
    {
        scanf("%d%d",&W,&L);
        scanf("%s",s);
        for(int i=0;i<W;i++)scanf("%s",w[i]);
        for(int i=0;i<L;i++)f[i]=L-i;
        for(int l=L-1;l>=0;l--){
            f[l]=f[l+1]+1;
            for(int i=0;i<W;i++){
                int len=strlen(w[i]);
                if(s[l]!=w[i][0])continue;
                int k=l,t=0;
                while(t<len&&k<L){
                    if(w[i][t]==s[k])t++,k++;
                    else k++;
                }
                if(t==len)f[l]=min(f[l],f[k]+k-l-len);
            }
        }
        printf("%d
    ",f[0]);
        return 0;
    }
  • 相关阅读:
    策略模式
    装饰模式
    责任链模式
    算法_快速排序
    算法_二分查找
    数据结构学习笔记_表
    集合遍历remove时ConcurrentModificationException异常
    LinkedHashMap笔记
    Windows相关命令
    高效率幂运算
  • 原文地址:https://www.cnblogs.com/01world/p/5653382.html
Copyright © 2011-2022 走看看