现场做的时候挺模糊的一个dp,借鉴了JustSteps的题解
就是用dp[i][j]表示按照i,j完全不同来处理最少用多少步
然后最后ans再来处理中间有不用刷的情况
代码也是基本按照JustSteps的写法。。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int dp[110][110];
char s1[110],s2[110];
int ans[110],len;
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
while(scanf("%s",s1)!=EOF)
{
scanf("%s",s2);
len=strlen(s1);
memset(dp,0,sizeof(dp));
for (int j=0;j<len;j++)
for (int i=j;i>=0;i--)
{
dp[i][j]=dp[i+1][j]+1;
for (int k=i+1;k<=j;k++)
{
if (s2[i]==s2[k])
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}
for (int i=0;i<len;i++)
ans[i]=dp[0][i];
for (int i=0;i<len;i++)
{
if (s1[i]==s2[i])
ans[i]=ans[i-1];
else
{
for (int j=0;j<i;j++)
ans[i]=min(ans[i],ans[j]+dp[j+1][i]);
}
}
printf("%d\n",ans[len-1]);
}
return 0;
}