Solution - P2101 命运石之门的选择

一道好题,最开始想出来了正解然后被自己否了,想了半个小时没想出来看了题解才发现。

思路

很明显这道题的答案最大是 \(n\)(全部竖着涂)。

这道题的填涂方法有两种:横涂和竖涂。显然我们可以横涂直到触碰到最小高度,然后图就被分割成了若干份。然后分治处理,取横涂和竖涂最优即可。

于是,没了。

代码

#include <bits/stdc++.h>
#define rint register int
#define rllong register long long
#define llong long long
#define N 5005
using namespace std;

int a[N];
int n;

inline int solve(rint l, rint r, rint k){
	rint minn = 1e9+7, res = 0;
	for(rint i = l; i <= r; ++i)
		if(a[i] <= minn) minn = a[i];
	rint i = l, j = l;
	while(i <= r){
		while(j <= n && a[j] > minn) ++j;
		res += solve(i, j-1, minn);
		i = j;
		while(i <= n && a[i] == minn) ++i;
		j = i;
	}
	return min(res+minn-k, r-l+1);
}

int main(){
	scanf("%d", &n);
	for(rint i = 1; i <= n; ++i) scanf("%d", &a[i]);
	printf("%d", solve(1, n, 0));
	return 0;
}

posted @ 2025-04-20 17:53  Hootime  阅读(8)  评论(0)    收藏  举报