BZOJ1260: [CQOI2007]塗色paint(洛谷P4170)

區間DP

BZOJ題目傳送門
洛谷題目傳送門

f[l][r]f[l][r]爲塗[l,r][l,r]需要的最少次數。那麼若左右端點的顏色相同,則有f[l][r]=min(f[l+1][r],f[l][r1])f[l][r]=min(f[l+1][r],f[l][r-1])。然後枚舉斷點kkf[l][r]=min(f[l][k]+f[k+1][r])f[l][r]=min(f[l][k]+f[k+1][r])

代碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 55
using namespace std;
int n,ans=1e9,f[N][N]; char s[N];
int dfs(int l,int r){
	if (~f[l][r]) return f[l][r];
	if (l==r) return f[l][r]=1; f[l][r]=1e9;
	if (s[l]==s[r]) f[l][r]=min(f[l][r],min(dfs(l,r-1),dfs(l+1,r)));
	for (int i=l;i<r;i++) f[l][r]=min(f[l][r],dfs(l,i)+dfs(i+1,r));
	return f[l][r];
}
int main(){
	scanf("%s",s+1),n=strlen(s+1);
	memset(f,-1,sizeof(f));
	return printf("%d\n",dfs(1,n)),0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章