`
暴风雪
  • 浏览: 377102 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[DP 动态规划]poj 3267:The Cow Lexicon

阅读更多

大致题意:

    给出一个长度为l的文本和一个由n个单词组成的字典。求至少从文本中去掉多少个字符才能使得这个文本全部由字典中的单词组成。

 

大致思路:

    DP,转移方程为dp[i]=min(dp[i-1]+1,dp[pos+1]+i-pos-1-tmp);//dp[i]为前i个字符中需要去掉的字符数量。

    转移的示例如下,这里文本是browndcodw 文本是cow,从str[9]开始匹配~~

     b r o w n d c o d w

                       c o    w  //找到一个匹配,并需要剔除一个字母。所以dp[10]可以从dp[6]转化而来。

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[1000];
char word[1000][30];
int dp[1000];
int main(){
    int n,len,i,j,pos,k,tmp;
    while(scanf("%d%d",&n,&len)!=EOF){
        scanf("%s",str);
        for(i=0;i<n;i++){
            scanf("%s",word[i]);
        }
        dp[0]=0;    //前i个字符中包含的非法字符数量
        for(i=1;i<=len;i++){
            dp[i]=dp[i-1]+1;
            for(j=0;j<n;j++){
                tmp=k=strlen(word[j]);
                k-=1;
                pos=i-1;
                while(pos>=0&&k>=0){
                    if(str[pos]==word[j][k]){
                        k--;
                    }
                    pos--;
                }
                if(k<0){      //可以匹配出一个单词
                    dp[i]=min(dp[i],dp[pos+1]+i-pos-1-tmp);
                }
            }
        }
        printf("%d\n",dp[len]);
    }
    return 0;
}
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics