//dp[i][j][k] k<26时,代表a串中i到j这一段全为字母‘a’+k时,变为b串需要的最小步数;
k=26时,代表没有对这一段处理时,变为b串需要的最小步数;
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char a[110],b[110];
int dp[110][110][27],l;
int f(int i,int j,int k)
{
if(i>j)return 0;
if(dp[i][j][k]!=-1)return dp[i][j][k];
char u=a[i];
if(k<26)u=k+97;
if(u==b[i])return dp[i][j][k]=f(i+1,j,k);
int mi=99999999;
for(int p=i;p<=j;p++)
{
mi=min(mi,1+f(i,p,b[i]-97)+f(p+1,j,k));
}
return dp[i][j][k]=mi;
}
int main()
{
//freopen("1.in","r",stdin);
while(scanf("%s%s",&a,&b)!=EOF)
{
memset(dp,-1,sizeof(dp));
l=strlen(a);
printf("%d\n",f(0,l-1,26));
}
}
hdu 2476 String painter 区间dp
最新推荐文章于 2021-07-31 18:20:15 发布