dp[i]表示从i到message末尾最少需要删去的字符数。
枚举每个单词进行匹配,不断更新最小删去数。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char mesg[400];
char dict[650][50];
int dp[400];
int main(int argc, char const *argv[]) {
int w, l;
scanf("%d%d%*c", &w, &l);
gets(mesg);
for (int i = 0; i < w; i++) {
gets(dict[i]);
}
dp[l] = 0;
for(int i = l - 1; i >= 0; i--) {
dp[i] = dp[i+1] + 1;
for(int j = 0; j < w; j++) {
int len = strlen(dict[j]);
if (len <= l - i && dict[j][0] == mesg[i]) {
int s = i;
int t = 0;
while (s < l) {
if (dict[j][t] == mesg[s++]) {
t++;
}
if (t == len) {
dp[i] = min(dp[i], dp[s] + s - i - len);
break;
}
}
}
}
}
printf("%d\n", dp[0]);
return 0;
}