得分成两个部分解决这个问题
dp[i][j]表示把一个空串(或者与目标串完全不同的串)刷成目标串所需要的步数。
我们去寻找目标串中间的字符,如果和这段头相同,就相当于在刷它的时候顺便刷了字符串头。
然后在根据第一步结果求res。
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAXN =310;
const int INF =1000000007 ;
const int MOD =1000000007;
const double EPS=1e-8;
const double pi = acos(-1);
int dp[MAXN][MAXN];
int ans[MAXN];
string a,b;
int main(){
while(cin>>a>>b){
int n=a.length();
memset(dp,0,sizeof(dp));
memset(ans,0,sizeof(ans));
for(int k=0;k<n;k++){
for(int i=0;i+k<n;i++){
int j=i+k;
dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
for(int m=i+1;m<=j;m++){
if(b[m]==b[i]){
dp[i][j]=min(dp[i][j],dp[i+1][m]+dp[m+1][j]);
}
}
}
}
for(int i=0;i<n;i++)
ans[i]=dp[0][i];
for(int i=0;i<n;i++){
if(a[i]==b[i])
ans[i]=ans[i-1];
else{
for(int j=0;j<i;j++){
ans[i]=min(ans[j]+dp[j+1][i],ans[i]);
}
}
}
printf("%d\n",ans[n-1]);
}
}