#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
vector<string> strlist;
string msg;
int m,n;
int main(){
int dp[303];
scanf("%d %d", &m, &n);
cin>>msg;
string temp;
for (int i = 0; i < m; ++i) {
cin>>temp;
strlist.push_back(temp);
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <=n ; ++i) {
dp[i] = dp[i-1]+1;
// 每次加入一个元素, 我们从后往前面遍历, 看看是不是因为这个字母的加入, 删除的东西变少
// !!!注意, 单词的遍历-1
// 查看msg[i-1]的加入
for (int k = 0; k < strlist.size(); ++k) {
string pat = strlist[k];
int pass = 0;
int nn = pat.size()-1;
bool flag = false;
for (int index = i-1; index>=0 ; --index) {
if (msg[index]==pat[nn]){
nn--;
} else{
pass++;
}
if (nn==-1) {
flag = true;
break;
}
}
if (flag) dp[i] = min(dp[i], dp[i-pass-pat.size()]+pass);
}
}
cout<<dp[n]<<endl;
}
poj 3267
最新推荐文章于 2018-09-12 14:34:48 发布