区间 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;
}
标签:int,60,P4170,涂色,CQOI2007,dp
From: https://www.cnblogs.com/UserJCY/p/18491801/jt_dp_P4170