題意:給你一個長的字符串,然後在給你幾個短的字符,需要從長字符串中減去幾個字符之後,那幾個短字符串才能組成一個長字符串(短字符串不一定全部用到)
解題思路:定義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;
}