博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
painting fence - 分治 - Codeforces 448c
阅读量:4627 次
发布时间:2019-06-09

本文共 1091 字,大约阅读时间需要 3 分钟。

2017-08-02 14:27:18

writer:pprp

题意:

  • 每块木板宽度均为1,高度为h[i]

  • n块木板连接为宽度为n的栅栏
  • 每次可以刷一横或一竖(上色)
  • 最少刷多少次可以使得栅栏被全部上色
  • 1 ≤ n ≤ 5000

算法分析:可以横着刷,可以竖着刷,横着刷是为了减小竖着刷的次数

    采用分治,每个分治中都取横着刷和竖着刷两者的最小值


 

代码及说明如下:

#include 
#include
using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 5010;int n;int a[maxn];//在递归算法中不要用n,应该考虑的是在每个部分,而不能只是在第一个递归中的角标int dfs(int l,int r){ int MIN = INF; int cnt = 0; //找到所有木板中最短的那个 for(int i = l ; i <= r; i++) { MIN = min(MIN, a[i]); } //将数目加上最短板长度 cnt += MIN; //所有的木板减去这个长度 for(int i = l; i <= r; i++) { a[i] -= MIN; } int left = l; // 分段递归解决问题 for(int i = l; i <= r; i++) { if(a[i] == 0) { cnt +=dfs(left,i-1); left = i+1 ; } } //最后一段,需要一个判断 if(left <= r) cnt += dfs(left,r); return min(cnt,r-l+1);}int main(){ cin >> n; for(int i = 1 ; i <= n ; i++) { cin >> a[i]; } cout << dfs(1,n) << endl; return 0;}

 

转载于:https://www.cnblogs.com/pprp/p/7273776.html

你可能感兴趣的文章
进程调度
查看>>
百练 2973 Skew数 解题报告
查看>>
C# 温故而知新:Stream篇(二)
查看>>
回首2016,展望2017
查看>>
你为什么应该经常访问招聘网站?招聘网站至少有4个方面的价值!
查看>>
HashMap源码分析(一)
查看>>
玩转Android之二维码生成与识别
查看>>
Python学习之路基础篇--10Python基础,函数进阶
查看>>
count http://www.cplusplus.com/reference/algorithm/count/
查看>>
Selenium2(WebDriver)总结(二)---Firefox的firebug插件参数设置(补充)
查看>>
个人冲刺1
查看>>
OS模块
查看>>
用node实现websocket协议
查看>>
对相机所看的视角截屏保存为图片
查看>>
最快地复制一张表
查看>>
Asp.Net 构架(HttpModule 介绍)
查看>>
PHP-错误处理
查看>>
[C#][EF] 添加表添加不进来
查看>>
jquery radio 取值
查看>>
WebFrom模拟MVC
查看>>