P4170 [CQOI2007] 涂色 区间 dp

UserJCY / 2024-11-09 / 原文

P4170 [CQOI2007] 涂色

区间 dp 模板题,不理解为什么是蓝。

将现在考虑的区间 \([l,r]\) 分为 \([l,k]\)\([k+1,r]\),如果 \(s_l=s_r\) 就可以一起涂,少涂一次。

方程:

\[dp_{l,r}=\min_{k=l}^{r-1} dp_{l,k}+dp_{k+1,r}-[s_l=s_r] \]

代码:

#include<bits/stdc++.h>
using namespace std;
char s[60];
int dp[60][60];
int n;
int dfs(int l,int r){
	if(dp[l][r])return dp[l][r];
	if(l==r)return dp[l][r]=1;
	dp[l][r]=114514;
	for(int k=l;k<r;k++){
		dp[l][r]=min(dp[l][r],dfs(l,k)+dfs(k+1,r)-(s[l]==s[r]));
	}
	return dp[l][r];
}
int main(){
	scanf("%s",s+1);
	n=strlen(s+1);
	cout<<dfs(1,n)<<endl;
	return 0;
}