luogu P4170 [CQOI2007]涂色

题目描述

假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。

每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。

用尽量少的涂色次数达到目标。

输入格式

输入仅一行,包含一个长度为n的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。

输出格式

仅一行,包含一个数,即最少的涂色次数。

说明/提示

40%的数据满足:1<=n<=10

100%的数据满足:1<=n<=50


区间动态规划

如果边界相同,那么可以看成多划了一笔

然后就是断开考虑

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=55;
int a[N],n;
int f[N][N];
int main(){
	char c;
	while(1){
		c=getchar();
		if(c=='\n')break;
		a[++n]=c-'A'+1;
	}
	memset(f,0x7f,sizeof(f));
	for(int i=1;i<=n;i++)f[i][i]=1;
		
	for(int len=2;len<=n;len++)
	for(int l=1;l+len-1<=n;l++){
		int r=len+l-1;
		if(a[l]==a[r])
		f[l][r]=min(f[l+1][r],f[l][r-1]);
		for(int k=l;k<r;k++)
		f[l][r]=min(f[l][k]+f[k+1][r],f[l][r]);
	}
	cout<<f[1][n]<<endl;
}
posted @ 2019-10-11 20:56  白木偶君  阅读(108)  评论(0编辑  收藏  举报