动态规划,用到字符串的处理
原字符串:s[]
字典:dic[][]
采用的从后往前的处理方式
状态转移方程:d[i]=d[i+1]+1 直接删除或匹配不成功而删除
=min(d[i],d[i+len+N]+N)
len:若s为"codw",dic[0]="cow",len=strlen(dic[0]),对于s中的每个字符s[i],每
次只检查dic中以s[i]开始的即可,
N:匹配这个串删除的字符
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXX 605
#define MAXY 305
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int n,l,i,j,k,d[MAXY];
char dic[MAXX][MAXY],s[MAXY];
scanf("%d%d",&n,&l);
scanf("%s",s);
d[l]=0;
for(i=0;i<n;i++)
{
scanf("%s",dic[i]);
}
for(i=l-1;i>=0;i--)
{
d[i]=min(MAXY,d[i+1]+1);
for(j=0;j<n;j++)
{
if(s[i]==dic[j][0])
{
int ini=i,cont=0;
for(k=0;dic[j][k]&&s[ini];)
{
if(s[ini]==dic[j][k])
{
ini++;
k++;
}
else
{
cont++;
ini++;
}
}
//cout<<s[i]<<k<<endl;
if(!dic[j][k])
{
//cout<<i<<d[i]<<" "<<d[i+strlen(dic[j])+cont]+cont<<endl;
d[i]=min(d[i],d[i+strlen(dic[j])+cont]+cont);
}
}
}
//cout<<d[i]<<" ";
}
cout<<d[0]<<endl;
}