题目链接: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:分治相关推荐

  1. Code Forces 448C Painting Fence 贪婪的递归

    略有上升称号,最近有很多问题,弥补啊,各类竞赛滥用,来不及做出了所有的冠军.这个话题 这是一个长期记忆的主题.这是不是太困难,基本技能更灵活的测试,每次我们来看看这个问题可以被删除,处理然后分段层,贪 ...

  2. CF448C Painting Fence(分治递归/DFS)难度⭐⭐⭐

    题目链接 有n块连着的木板,每个木板的高度为hih_ihi​,你需要把这n块木板上色,每次 上色你可以选择竖着刷完一块木板,或者横着刷一个高度单位的连续的木板(不能中 间空着的不能跳跃),问最少需要刷 ...

  3. CodeForces - 1480D2 Painting the Array II(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求拆分成两个子序列,使得两个子序列的贡献之和最 小.对于一个序列的贡献就是,去掉相邻且相同的字母后的长度,即 ∑i=1n[a[i]! ...

  4. CodeForces - 1480D1 Painting the Array I(贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求拆分成两个子序列,使得两个子序列的贡献之和最 大.对于一个序列的贡献就是,去掉相邻且相同的字母后的长度,即 ∑i=1n[a[i]! ...

  5. [CodeForces 300D Painting Square]DP

    http://codeforces.com/problemset/problem/300/D 题意:每一次操作可以选一个正方形,令边长为n,如果n为奇数那么可以从中间画一个十字,分成4个大小相等的边长 ...

  6. codeforces 762E(cdq分治)

    题意: n个电台,每个电台有三个属性xi, ri, fi.分别代表电台的坐标,电台的播报范围,以及播报的频率. 对于一对电台i, j,若min(ri, rj) >= |xi - xj|,那么他们 ...

  7. Codeforces 300D Painting Square dp

    Painting Square 转换一下变成 a 层的完全四叉树, 占领 k 个点有多少种方案, 点能被占当且仅当它的父亲被占. a <= 30, 所以我们把每层都dp出来, dp[ i ][ ...

  8. CodeForces - 97B Superset (思维/分治/构造)

    题目大意: 给定n个点的点集,要求向点集里添加一些点,使点集中的任意两个点满足下列三个条件中的一个:       ①在同一行  ②在同一列       ③以这两个点为对角构成的矩形的内部或者边缘包含其 ...

  9. Codeforces 1140F 线段树 分治 并查集

    题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...

最新文章

  1. C# + ArcEngine 常用方法(不定时更新)
  2. linux应用日志类型,linux日志分析
  3. cannot import name 'imresize' from 'scipy.misc'
  4. Java 8 Friday:语言设计很微妙
  5. mybatis那些事~
  6. html表单提交不判断,请问jquery有方法可以判断一个表单提交之后结果是成功或不成功吗?...
  7. 20110123 - 调试时IDE的匪夷所思行为
  8. 概率论学习之瓢虫冬眠
  9. 采用文件白名单方式构建主机安全环境
  10. java jdk 8 中文文档
  11. html5直播礼物动画,GitHub - General757/giftanim: 直播礼物动画 送赞送礼物动画 仿映客礼物动画侧栏弹出送花人和礼物以及x1 x2 x3效果,支持队列 排序...
  12. 纯数学教程 Page 325 例LXVIII (4) 比值判别法和达朗贝尔判别法失效的一种情形...
  13. 小米平板2刷哪个系统更流畅_你想用什么系统的小米平板2,Win10还是MIUI7?
  14. VMware Workstation 英文改中文界面
  15. 让你心动的20句励志文案
  16. 【xla】四、【构图阶段】BuildXlaOpsPass
  17. 关于文件句柄数和文件描述符的区分
  18. found duplicated code in this file
  19. 2022-2027年(新版)中国有机硅行业运行动态及产销需求预测报告
  20. # 解决微信小程序遮罩层底部页面滚动

热门文章

  1. OpenCV 相机校正
  2. js 检测input输入值是否全是汉字
  3. 【linux系统】IK分词器安装
  4. .PHP $_SERVER返回上一页
  5. MySql入门使用:登录及简单创建查询表
  6. 大文件分片上传,断点续传,秒传 实现
  7. linux系统性能优化及瓶颈分析
  8. LINQ 101——分组、Set、转换、Element
  9. http://jsbeautifier.org/
  10. TextView中文字实现跑马灯