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:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 5005
#define INF 1000000000 using namespace std; int n;
int a[MAX_N]; int dfs(int x,int y)
{
if(x==y) return ;
int minn=INF;
for(int i=x;i<=y;i++) minn=min(minn,a[i]);
for(int i=x;i<=y;i++) a[i]-=minn;
int sum=;
int p=x;
for(int i=x;i<=y;i++)
{
if(a[i] && (i==y || !a[i+])) sum+=dfs(p,i);
if(!a[i] && i<y && a[i+]) p=i+;
}
return min(sum+minn,y-x+);
} int main()
{
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
cout<<dfs(,n)<<endl;
}
Codeforces 448C Painting Fence:分治的更多相关文章
- [Codeforces 448C]Painting Fence
Description Bizon the Champion isn't just attentive, he also is very hardworking. Bizon the Champion ...
- Codeforces 448C Painting Fence(分治法)
题目链接:http://codeforces.com/contest/448/problem/C 题目大意:n个1* a [ i ] 的木板,把他们立起来,变成每个木板宽为1长为 a [ i ] 的栅 ...
- codeforces 256 div2 C. Painting Fence 分治
C. Painting Fence time limit per test 1 second memory limit per test 512 megabytes input standard in ...
- CF-448C Painting Fence 分治
Painting fence 题意 乍一看以为是之前做过的一道单调队列优化的DP,不是. 也是有n块木板,每个木板宽1米,有一个高度ai,现在要把他们刷成橘色,给了你一个宽一米的刷子,你可以横着刷,或 ...
- painting fence - 分治 - Codeforces 448c
2017-08-02 14:27:18 writer:pprp 题意: • 每块木板宽度均为1,高度为h[i] • n块木板连接为宽度为n的栅栏 • 每次可以刷一横或一竖(上色) • 最少刷多少次可以 ...
- 448C - Painting Fence(分治)
题意:给出宽为1高为Ai的木板n条,排成一排,每次上色只能是连续的横或竖并且宽度为1,问最少刷多少次可以使这些木板都上上色 分析:刷的第一步要么是所有的都竖着涂完,要么是先横着把最矮的涂完,如果是第一 ...
- cf 448c Painting Fence
http://codeforces.com/problemset/problem/448/C 题目大意:给你一个栅栏,每次选一横排或竖排染色,求把全部染色的最少次数,一个点不能重复染色. 和这道题有点 ...
- C. Painting Fence 分治
memory limit per test 512 megabytes input standard input output standard output Bizon the Champion i ...
- codeforces C. Painting Fence
http://codeforces.com/contest/448/problem/C 题意:给你n宽度为1,高度为ai的木板,然后用刷子刷颜色,可以横着刷.刷着刷,问最少刷多少次可以全部刷上颜色. ...
随机推荐
- Swing实现系统托盘
/* 实现系统托盘化 */ protected void setToolSystemTray() { // 系统是否支持系统托盘 if (SystemTray.isSupported()) { // ...
- 【机器学习详解】SMO算法剖析(转载)
[机器学习详解]SMO算法剖析 转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/51227754 CSDN−勿在浮沙筑高台 本文力 ...
- homebrew可以管理众多开源软件的安装和卸载
通过homebrew可以管理众多开源软件的安装和卸载. 参考https://github.com/mxcl/homebrew/wiki 1. 安装: ruby -e "$(curl -fsS ...
- android.util.AndroidRuntimeException Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? com.uethinking.microvideo.manag
记录学习,网络摘抄 碰到这个异常其实这个上面说的很清楚,加个flag 从一个Activity中要通过intent调出另一个Activity的话,需要使用 FLAG_ACTIVITY_NEW_TASK ...
- Hadoop编码解码【压缩解压缩】机制具体解释(1)
想想一下,当你须要处理500TB的数据的时候,你最先要做的是存储下来. 你是选择源文件存储呢?还是处理压缩再存储?非常显然,压缩编码处理是必须的.一段刚刚捕获的60分钟原始视屏可能达到2G,经过压缩处 ...
- Google Gson实现JSON字符串和对象之间相互转换
User实体类 package com.test.json; /** * User 实体类 */ public class User { private String name; private St ...
- thinkPHP5.0的学习研究【架构】
2017年6月19日18:51:53 架构:1.ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织.2.MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC ...
- nginx学习之简化安装篇(一)
环境:CentOS 6.5 1. 安装依赖环境 [root@localhost ~]# yum install pcre-devel zlib-devel openssl-devel -y 2. 安装 ...
- 监听并保存ssh账号密码
有时候渗透搞下一台服务器的权限,想通过此服务器抓取其他服务器的ssh密码.就可以用以下方法,如果管理员通过这台服务器作为跳板登录其他服务器,密码就会记录下来. alias ssh='strace -o ...
- 在函数中如何获取 线程对象、线程唯一ID
threading.current_thread() threading.current_thread().ident