nyoj 1216——整理图书 CF 229D—— Towers——————【dp+贪心】
整理图书
- 描述
-
小明是图书鹳狸猿,他有很多很多的书堆在了一起摆在了架子上,每摞书是横着放的,而且每摞书是订好的是一个整体,不可分开,(可以想象架子是一条直线),但是这些书高度却参差不齐,小明有强迫症,看不得不整齐所以他想让这些书的高度形成一个非降序列他才舒心,可是这些书是有序的,所以他只能把其中的一摞书和他相邻的书装订在一起形成一摞新的书,那么他最少的装订次数是多少呢
- 输入
- 多组测试数据,处理到文件结束
每组数据开始有一个n(1<=n<=1000)表示有n摞书
接下来一行是这n摞书的高度a[i],(1<=a<=10^5)(虽然这个高度有点扯淡) - 输出
- 首先输出Case num : 表示第几组数据
接下来对于每组数据输出最少的装订次数 - 样例输入
-
5
8 2 7 3 1
1
100 - 样例输出
-
Case 1: 3
Case 2: 0 - 提示
- 第一组样例:将后4本书装订在一起,共装订3次,组成8 13
第二组样例:只有一本书,无需装订 - 解题思路:我们定义dp[i]表示将前i摞图书整理成非降序列时的最少步数。定义h[i]表示前i摞书的最高的书高。同时sum[i]来记录前i摞书的总高度。dp[i]=dp[j]+(i-j-1)。如果前j摞书中最高书高小于等于sum[i]-sum[j]。则判断是否将j--->i这么多摞书合并在一块儿是否比dp[i]更小,如果是,则更新dp[i],h[i]。为什么从i-1开始只要能找到更新dp[i]的就算是最优结果了?因为dp[j]已经是最优结果了,那么我在最优解的基础上找到最小的增量,那么dp[i]也肯定是最优解了。
-
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 5050;
int a[maxn], sum[maxn], dp[maxn], h[maxn];
int main() {
int n, cnt = 0;
while ( scanf ( "%d", &n ) != EOF ) {
memset ( sum, 0, sizeof ( sum ) );
for ( int i = 1; i <= n; i++ ) {
scanf ( "%d", &a[i] );
h[i] = max ( h[i - 1], a[i] );
sum[i] = sum[i - 1] + a[i];
}
memset ( dp, INF, sizeof ( dp ) );
dp[0] = 0; //当前0或1摞书非降序时需要最少装订次数为0
dp[1] = 0;
for ( int i = 2; i <= n; i++ ) {
for ( int j = i - 1; j >= 0; j-- ) {
if ( h[j] <= sum[i] - sum[j] ) {//当前j个中最大高度大于等于从j到i的总书高,进行状态转移
if ( dp[i] > dp[j] + i - j - 1 ) {
dp[i] = dp[j] + i - j - 1; //更新dp
h[i] = sum[i] - sum[j]; //更新前i摞书中最高的书高高度
break;
}
}
}
}
printf ("*Case %d: %d\n",++cnt, dp[n] );
}
return 0;
}
/*
6
5 5 2 3 5 5 */
nyoj 1216——整理图书 CF 229D—— Towers——————【dp+贪心】的更多相关文章
- CF 553A 组合DP
http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...
- UVA.10066 The Twin Towers (DP LCS)
UVA.10066 The Twin Towers (DP LCS) 题意分析 有2座塔,分别由不同长度的石块组成.现在要求移走一些石块,使得这2座塔的高度相同,求高度最大是多少. 问题的实质可以转化 ...
- BZOJ 2021 [Usaco2010 Jan]Cheese Towers:dp + 贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2021 题意: John要建一个奶酪塔,高度最大为m. 他有n种奶酪.第i种高度为h[i]( ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- CF 445A 简单DP
今天早上找一道题的bug,还是找不出来,下午刷了几道水题,晚上准备回家的事, 然后本来想打CF的,一看,数学场,不打了. 这道题的题意: 给出一个序列,每次你可以从这个序列里面选择一个数ak,删除,然 ...
- HDU 4632 CF 245H 区间DP(回文)
先说HDU 4632这道题,因为比较简单,题意就是给你一个字符串,然后给你一个区间,叫你输出区间内所有的回文子序列,注意是回文子序列,不是回文字串. 用dp[i][j]表示区间[i,j]内的回文子序列 ...
- CF 219D 树形DP
CF 219D [题目链接]CF 219D [题目类型]树形DP &题意: 给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到 ...
- nyoj 1091 还是01背包(超大数dp)
nyoj 1091 还是01背包 描述 有n个重量和价值分别为 wi 和 vi 的物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值 1 <= n <=40 1 ...
随机推荐
- EIP-uni-app框架-建立项目
uni-app介绍 uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS.Android.H5.小程序等多个平台.uni-app在跨端数量,扩展能力, ...
- 用递归算法返回该元素id下面的所有子集id
private List<int> listAreaId = new List<int>(); /// <summary> /// 递归获取本区域下面的所有子集 / ...
- 阿里开源混沌工程工具 ChaosBlade
https://github.com/chaosblade-io/chaosblade
- java的一些最最最最基本的东西,纯粹是为了保存
1.方法签名 指的是方法名和参数类型 2.java类初始化数据的方法 构造函数 声明变量时赋值 静态块 3.List转数组 List<String> list = new ArrayLis ...
- boostrap selectpicker 用法
1..html中先引用 <link href="{{ url_for('static', filename='css/bootstrap-select.css') }}" r ...
- iOS开发图片与颜色处理工具
1.根据颜色生成一张图片 /** 根据颜色生成一张图片 @param color 颜色进制 UIColor类型 @return 一张UIImage图片 */ + (UIImage *)createIm ...
- KDevelop4调试pcl一直读取不到.pcd文件
如题所示,KD下,能编译,运行时一直使用reader.read读取不到pcd,但是使用cmake能正常运行. 后来,使用terminator删掉工程的build文件夹,直接在工程文件下进行编译,报错提 ...
- kuangbin专题十六 KMP&&扩展KMP HDU3068 最长回文
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为 ...
- 2018-2019-2 20165320 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
2018-2019-2 20165320 <网络对抗技术> Exp6 信息搜集与漏洞扫描 一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 1.各种搜索技巧应用 ...
- Unity组件
在学习C++的时候,对于面对对象有点了解.然后也使用过一段时间的Unity,用起来还是觉得,怎么这么好用.耦合性极低.当时不知道这是基于组件编程.所以现在来学习下基于组件的知识,并比较下基于组件和基于 ...