P4170 [CQOI2007]涂色(区间dp)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4170 [CQOI2007]涂色(区间dp)相关的知识,希望对你有一定的参考价值。

P4170 [CQOI2007]涂色(区间dp)

考虑如何转移。

对于区间 [ l , r ] [l,r] [l,r]

s l ≠ s r s_l\\ne s_r sl=sr 可以枚举断点更新。

否则 f ( l , r ) = m i n ( f ( l + 1 , r ) , f ( l , r − 1 ) ) f(l,r)=min(f(l+1,r),f(l,r-1)) f(l,r)=min(f(l+1,r),f(l,r1))

时间复杂度: O ( n 3 ) O(n^3) O(n3)

// Problem: P4170 [CQOI2007]涂色
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4170
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2022-01-07 16:10:26
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=55,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

int n,f[N][N];
char a[N];
int main()
	scanf("%s",a+1);
	n = strlen(a+1);
	mst(f,0x3f);
	rep(i,1,n)
		f[i][i] = 1;
		//if(i<n) f[i][i+1] = a[i]==a[i+1]?1:2;
	
	for(int k=2;k<=n;k++)
		for(int i=1,j=k;j<=n;i++,j++)
			for(int p=i;p<j;p++)
				f[i][j] = min(f[i][j],f[i][p]+f[p+1][j]);
			
			if(a[i] == a[j])
				f[i][j] = min(f[i][j-1],f[i+1][j]);
			
		
	
	printf("%d\\n",f[1][n]);
	return 0;


以上是关于P4170 [CQOI2007]涂色(区间dp)的主要内容,如果未能解决你的问题,请参考以下文章

P4170 [CQOI2007]涂色

解题报告:luogu P4170

解题报告:luogu P4170

[DP 区间] [CQOI2007]涂色

CQOI2007 涂色

BZOJ1260 [CQOI2007]涂色paint(区间dp)