字符串涂漆
题解:
本题基本思路与前一题一致,不同点在于本题给了原有字符串,那么我们现在只需要考虑原有字符串对于染色结果的影响,我们需要一个额外的数组来记录1到i之间最小的价值,显然当涂色前后颜色一样时,我们就不用再涂这个格子了
代码:
#include<bits/stdc++.h>
using namespace std;
int dp1[205][205],dp2[205];
char before[205],after[205];
int main() {
scanf("%s%s",before+1,after+1);
int n=strlen(before);
memset(dp1,0x7f,sizeof(dp1));
memset(dp2,0x7f,sizeof(dp2));
for(int i=1; i<=n; i++) dp1[i][i]=1;
for(int len=1; len<n; len++) {
for(int l=1; l+len-1<n; l++) {
int r=l+len;
if(after[l]==after[r]) dp1[l][r]=min(dp1[l][r-1],dp1[l+1][r]);
else for(int k=l; k<r; k++) dp1[l][r]=min(dp1[l][r],dp1[l][k]+dp1[k+1][r]);
}
}
for(int i=1;i<=n;i++){
if(before[i]==after[i]) dp2[i]=dp2[i-1];
else{
dp2[i]=dp1[1][i];
for(int j=1;j<i;j++) dp2[i]=min(dp2[i],dp2[j]+dp1[j+1][i]);
}
}
printf("%d\n",dp2[n]);
return 0;
}