DP[i]代表到从第一个位置到第i个位置最少删除的个数,需要到DP[i]时,用长度小于等于i的单词优化结果。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<climits>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<list>
#define LL long long
#define maxn 810
using namespace std;
char str[maxn];
char dic[maxn][maxn/10];
int dp[maxn];
int len[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",str+1);
for(int i=0;i<n;++i)
{
scanf("%s",dic[i]);
len[i]=strlen(dic[i]);
}
for(int i=0;i<=m;++i)
{
dp[i]=i;
}
for(int i=1;i<=m;++i)
{
dp[i]=dp[i-1]+1;
for(int j=0;j<n;++j)
{
int pos=len[j]-1;
if(dic[j][pos]==str[i] && i>=len[j])
{
int pj=pos,pi=i;
while(pj>=0 && pi>=0 )
{
if(dic[j][pj]==str[pi] )
pj--;
pi--;
}
if(pj==-1)
{
// if(i==7)
// cout<<"yes"<<endl;
// cout<<"pi=="<<pi<<endl;
// cout<<"LL"<<endl;
// cout<<dp[pi-1]<<" "<<dp[i-1]<<" "<<pi-pj-i<<endl;
dp[i]=min(dp[i],dp[pi]+i-pi-len[j] );
// cout<<"dp[pi-1]=="<<dp[pi-1]<<endl;
}
}
}
}
// for(int i=0;i<=m;++i)
printf("%d\n",dp[m]);
cout<<endl;
}