您的位置:首页 > 其它

POJ - 3267 The Cow Lexicon

2013-11-22 20:51 483 查看
题意:求最少将母串删除几个,使得由字典里字符串连接起来,刚开始是想用dp[i]表示母串前i个有字典里的字符串其中一个组成的最小删除个数,但这明显要从字典里面最短的开始表示啊,那之前的就无法考虑了,所以从后面开始考虑,用dp[i]表示从i到母串末由字典里的字符串组成的最少删除个数,那么每次的i最坏的情况就是删了,不然就枚举字典里的字符串,找出最小的删除个数,删除的个数计算也很容易
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 605;

int dp[MAXN];
char s[MAXN],dit[MAXN][30];
int w,l;

int main(){
    while (scanf("%d%d%*c",&w,&l) != EOF){
        scanf("%s",s);
        for (int i = 1; i <= w; i++)
            scanf("%s",dit[i]);
        for (int i = 0; i < l; i++)
            dp[i] = l;
        dp[l] = 0;
        for (int i = l-1; i >= 0; i--){
            dp[i] = dp[i+1] + 1;
            for (int j = 1; j <= w; j++){
                int n = strlen(dit[j]);
                if (dit[j][0] == s[i] && n <= l-i){
                    int k,t = 0;
                    for (k = i; k < l; k++)
                        if (s[k] == dit[j][t])
                            if (++t == n)
                                break;
                    if (k < l)
                        dp[i] = min(dp[i],dp[k+1]+k-i+1-n);
                }
            }
        }
        printf("%d\n",dp[0]);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: