字符串涂漆

字符串涂漆
题解:
本题基本思路与前一题一致,不同点在于本题给了原有字符串,那么我们现在只需要考虑原有字符串对于染色结果的影响,我们需要一个额外的数组来记录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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值