洛谷P2101 命运石之门的选择 题解
Problem
Solution
分析题目容易发现,对于任意的画,有两种染色方法:
-
竖直染色,容易发现需要染色 \(n\) 次(\(n\) 表示矩形的个数);
-
先找到画中最大的矩形,水平染色,再考虑对剩下的部分染色。
对于第二种方式的剩下部分,我们可以同样的考虑两种染色方法,递归求出最终结果即可。
最终取两种方案的最小值即可。
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;
}

浙公网安备 33010602011771号