Loading

洛谷P2101 命运石之门的选择 题解

Problem

Solution

分析题目容易发现,对于任意的画,有两种染色方法:

  1. 竖直染色,容易发现需要染色 \(n\) 次(\(n\) 表示矩形的个数);

  2. 先找到画中最大的矩形,水平染色,再考虑对剩下的部分染色。

对于第二种方式的剩下部分,我们可以同样的考虑两种染色方法,递归求出最终结果即可。

最终取两种方案的最小值即可。

Code

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i>=(b);i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define elif else if

const int N=5004,INF=2e9;
int n,h[N];
inline int solve(int l,int r)
{
	if(l==r)return 1;
	int Min=INF;
	For(i,l,r)Min=min(Min,h[i]);
	For(i,l,r)h[i]-=Min;
	// cout<<l<<" "<<r<<"\n";
	// For(i,l,r)cout<<h[i]<<" ";cout<<"\n";
	int sum=Min,now=l;
	For(i,l,r)
	{
		if(h[i-1]==0 && h[i]!=0)now=i;
		if(h[i]!=0 && (h[i+1]==0 || i==r))sum+=solve(now,i);
	}
	return min(sum,r-l+1);
}
int main()
{
	IOS;
	cin>>n;
	For(i,1,n)cin>>h[i];
	cout<<solve(1,n);

	return 0;
}
posted @ 2024-08-11 20:59  ๑҉v  阅读(14)  评论(0)    收藏  举报