首页 > 代码库 > Codeforces Round #256 (Div. 2)——Painting Fence
Codeforces Round #256 (Div. 2)——Painting Fence
题目连接
- 题意:
n个木条,输入n个木条的高度,每个木条的宽度均为1。现在有长宽均为1的刷子,每次可以选择横着刷或者竖着刷,每次刷的时候不能离开木条,问将所有木条均涂色至少需要刷几次。(刷的时候可以经过已经被刷过的地方)
n (1?≤?n?≤?5000),1?≤?ai(高度)?≤?109 - 分析:
分析一下横着和竖着的关系:假设现在已经有一个操作集合S是答案,那么集合中的操作顺序是可以改变的,即横和竖的顺序可以改变(因为可以经过已经涂色的木条),那么不妨先横着涂色。对于当前[l,r]的区间,答案不会超过r - l + 1。设最短的木条为h1,可以先横着刷h1次,然后就将区间分成了两个区间来解决,最后与长度取min
const int maxn = 51000; int h[maxn], n; int fun(int l, int r, int sub) { if (l > r) return 0; int Min = INF, id; FE(i, l, r) if (h[i] < Min) { Min = h[i]; id = i; } return min(r - l + 1, fun(l, id - 1, Min) + fun(id + 1, r, Min) + Min - sub); } int main() { while (~RI(n)) { FE(i, 1, n) RI(h[i]); cout << fun(1, n, 0) << endl; } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。