P4170 [CQOI2007]涂色

传送门

区间dp,设\(f[l][r]\)表示区间\((l,r)\)的最小次数,当\(l==r\)时为\(1\),当\(s[l]==s[r]\)时为\(min(f[l][r-1],f[l+1][r])\),否则枚举断点\(k\),为\(min(f[l][k]+f[k+1][r])\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=55;
char s[N];int f[N][N],n;
int main(){
//	freopen("testdata.in","r",stdin);
	scanf("%s",s+1),n=strlen(s+1),memset(f,0x3f,sizeof(f));
	fp(i,1,n)f[i][i]=1;
	fp(l,1,n-1)fp(i,1,n-l){
		if(s[i]==s[i+l])f[i][i+l]=min(f[i+1][i+l],f[i][i+l-1]);
		else fp(k,i,i+l-1)f[i][i+l]=min(f[i][i+l],f[i][k]+f[k+1][i+l]);
	}printf("%d\n",f[1][n]);return 0;
}
posted @ 2018-12-06 21:52  bztMinamoto  阅读(195)  评论(0编辑  收藏  举报
Live2D