P4170 [CQOI2007] 涂色
P4170\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU-P4170} }{{\color{Red}\Large Solution} }\mathbf{} {No.1} \end{Bmatrix}\times{}\) NeeDna
各位好 没想到这题变成紫题了 所以我就来水一篇题解
首先很明显 这一道题属于区间dp 所谓区间dp就是把一个问题分成多个区间,然后分区寻找最优解
若染色为A B C B A
我们可以分段为 A B C /   B   /   A
或者 A B C B/ A
其他的方案先不讨论 为了证明动态规划的正确性 我们可以看第一种 发现 左端点与右端点一致时 总会刷新当前的可以同一遍染色的最小次数(某次的最长长度) 所以对于这个题 可以当成无后效性来理解
因此我们可以发现当区间左右端点坐标为l r时 有以下的状态转移方程
if(a[l]==a[r]) f[l[r]=min(f[l[r],dfs(l,i)+dfs(i+1,r)-1);
else f[l][r]=min(f[l][r],dfs(l,i)+dfs(i+1,r));
所以 我们就可以得到以下的ac代码
#include<bits/stdc++.h>
using namespace std;
char n;
string a;
int f[1010][1010];
int dfs(int l,int r){
	if(l==r) return 1;
	if(f[l][r]) return f[l][r];
	f[l][r]=9999999;
	for(int i=l;i<r;i++){
		if(a[l]==a[r]) f[l][r]=min(f[l][r],dfs(l,i)+dfs(i+1,r)-1);
		else f[l][r]=min(f[l][r],dfs(l,i)+dfs(i+1,r));
	}
	return f[l][r];
}
int main(){
    cin>>a;
    cout<<dfs(0,a.size()-1);
	return 0;
}	
本人彩笔 勿喷

                
            
        
浙公网安备 33010602011771号