POJ - 3267 The Cow Lexicon

来源:互联网 发布:恒星际航行 知乎 编辑:程序博客网 时间:2024/05/04 22:51
题意:求最少将母串删除几个,使得由字典里字符串连接起来,刚开始是想用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;}



原创粉丝点击