POJ-3267-The Cow Lexicon(簡單DP)

題意:給你一個長的字符串,然後在給你幾個短的字符,需要從長字符串中減去幾個字符之後,那幾個短字符串才能組成一個長字符串(短字符串不一定全部用到)
解題思路:定義dp[j] 爲從j到len 需要減去dp[j] 個字符。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[305];
char mess[305];
char dict[605][305];

int main()
{
    int dictN, messL;
    while (~scanf("%d%d", &dictN, &messL)) {
        memset(dp, 0, sizeof(dp));
        scanf("%s", mess);
        for (int i = 0; i < dictN; i++) {
            scanf("%s", dict[i]);
        }
        for (int i = messL - 1; i >= 0; i--) {
            dp[i] = dp[i + 1] + 1;
            for (int j = 0; j < dictN; j++) {
                int len = strlen(dict[j]);
                if (len <= messL - i && dict[j][0] == mess[i]) {
                    int pDict = 1;
                    int pMess = i + 1;
                    while (pMess < messL) {
                        if (mess[pMess] == dict[j][pDict]) {
                            pDict++;
                        }
                        pMess++;
                        if (pDict == len) {
                            dp[i] = min(dp[i] , dp[pMess] + (pMess - i - len));
                            break;
                        }

                    }
                }
            }
        }
        printf("%d\n", dp[0]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章