Codeforces 448C Painting Fence:分治
题目链接:http://codeforces.com/problemset/problem/448/C
题意:
有n个木板竖着插成一排栅栏,第i块木板高度为a[i]。
你现在要将栅栏上所有地方刷上油漆。
每次你可以选择竖着刷或横着刷,但必须保证一次刷的地方不能间断。
问你至少要刷几次才能刷满。
题解:
首先有一个贪心结论:
对于当前要刷的一片区域,令minn为这片区域的最小高度。
如果选择横着刷,则至少要将区域底部的minn层刷完。
如图,至少要将下面两层刷完:
然后考虑如何分治:
对于当前的这一片区域,将最下面的minn层去掉之后,原区域就变成了若干个小区域。
这样就转化成了若干个子问题。
所以当前区域的最小次数 = min( 只竖着刷的次数, 先横着刷minn次 + ∑ 子区域的最小次数 )
即:dfs(x,y) = min(y-x+1, minn + ∑ dfs(Li,Ri))
边界条件:x == y时,最多只用竖着刷一次。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAX_N 5005 5 #define INF 1000000000 6 7 using namespace std; 8 9 int n; 10 int a[MAX_N]; 11 12 int dfs(int x,int y) 13 { 14 if(x==y) return 1; 15 int minn=INF; 16 for(int i=x;i<=y;i++) minn=min(minn,a[i]); 17 for(int i=x;i<=y;i++) a[i]-=minn; 18 int sum=0; 19 int p=x; 20 for(int i=x;i<=y;i++) 21 { 22 if(a[i] && (i==y || !a[i+1])) sum+=dfs(p,i); 23 if(!a[i] && i<y && a[i+1]) p=i+1; 24 } 25 return min(sum+minn,y-x+1); 26 } 27 28 int main() 29 { 30 cin>>n; 31 for(int i=1;i<=n;i++) cin>>a[i]; 32 cout<<dfs(1,n)<<endl; 33 }
转载于:https://www.cnblogs.com/Leohh/p/8252765.html
Codeforces 448C Painting Fence:分治相关推荐
- Code Forces 448C Painting Fence 贪婪的递归
略有上升称号,最近有很多问题,弥补啊,各类竞赛滥用,来不及做出了所有的冠军.这个话题 这是一个长期记忆的主题.这是不是太困难,基本技能更灵活的测试,每次我们来看看这个问题可以被删除,处理然后分段层,贪 ...
- CF448C Painting Fence(分治递归/DFS)难度⭐⭐⭐
题目链接 有n块连着的木板,每个木板的高度为hih_ihi,你需要把这n块木板上色,每次 上色你可以选择竖着刷完一块木板,或者横着刷一个高度单位的连续的木板(不能中 间空着的不能跳跃),问最少需要刷 ...
- CodeForces - 1480D2 Painting the Array II(dp)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求拆分成两个子序列,使得两个子序列的贡献之和最 小.对于一个序列的贡献就是,去掉相邻且相同的字母后的长度,即 ∑i=1n[a[i]! ...
- CodeForces - 1480D1 Painting the Array I(贪心)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求拆分成两个子序列,使得两个子序列的贡献之和最 大.对于一个序列的贡献就是,去掉相邻且相同的字母后的长度,即 ∑i=1n[a[i]! ...
- [CodeForces 300D Painting Square]DP
http://codeforces.com/problemset/problem/300/D 题意:每一次操作可以选一个正方形,令边长为n,如果n为奇数那么可以从中间画一个十字,分成4个大小相等的边长 ...
- codeforces 762E(cdq分治)
题意: n个电台,每个电台有三个属性xi, ri, fi.分别代表电台的坐标,电台的播报范围,以及播报的频率. 对于一对电台i, j,若min(ri, rj) >= |xi - xj|,那么他们 ...
- Codeforces 300D Painting Square dp
Painting Square 转换一下变成 a 层的完全四叉树, 占领 k 个点有多少种方案, 点能被占当且仅当它的父亲被占. a <= 30, 所以我们把每层都dp出来, dp[ i ][ ...
- CodeForces - 97B Superset (思维/分治/构造)
题目大意: 给定n个点的点集,要求向点集里添加一些点,使点集中的任意两个点满足下列三个条件中的一个: ①在同一行 ②在同一列 ③以这两个点为对角构成的矩形的内部或者边缘包含其 ...
- Codeforces 1140F 线段树 分治 并查集
题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...
最新文章
- C# + ArcEngine 常用方法(不定时更新)
- linux应用日志类型,linux日志分析
- cannot import name 'imresize' from 'scipy.misc'
- Java 8 Friday:语言设计很微妙
- mybatis那些事~
- html表单提交不判断,请问jquery有方法可以判断一个表单提交之后结果是成功或不成功吗?...
- 20110123 - 调试时IDE的匪夷所思行为
- 概率论学习之瓢虫冬眠
- 采用文件白名单方式构建主机安全环境
- java jdk 8 中文文档
- html5直播礼物动画,GitHub - General757/giftanim: 直播礼物动画 送赞送礼物动画 仿映客礼物动画侧栏弹出送花人和礼物以及x1 x2 x3效果,支持队列 排序...
- 纯数学教程 Page 325 例LXVIII (4) 比值判别法和达朗贝尔判别法失效的一种情形...
- 小米平板2刷哪个系统更流畅_你想用什么系统的小米平板2,Win10还是MIUI7?
- VMware Workstation 英文改中文界面
- 让你心动的20句励志文案
- 【xla】四、【构图阶段】BuildXlaOpsPass
- 关于文件句柄数和文件描述符的区分
- found duplicated code in this file
- 2022-2027年(新版)中国有机硅行业运行动态及产销需求预测报告
- # 解决微信小程序遮罩层底部页面滚动