整理图书
来源:互联网 发布:licecap for mac 编辑:程序博客网 时间:2024/05/21 14:45
整理图书
时间限制:3000 ms | 内存限制:65535 KB
难度:5
- 描述
- 小明是图书鹳狸猿,他有很多很多的书堆在了一起摆在了架子上,每摞书是横着放的,而且每摞书是订好的是一个整体,不可分开,(可以想象架子是一条直线),但是这些书高度却参差不齐,小明有强迫症,看不得不整齐所以他想让这些书的高度形成一个非降序列他才舒心,可是这些书是有序的,所以他只能把其中的一摞书和他相邻的书装订在一起形成一摞新的书,那么他最少的装订次数是多少呢
- 输入
- 多组测试数据,处理到文件结束
每组数据开始有一个n(1<=n<=1000)表示有n摞书
接下来一行是这n摞书的高度a[i],(1<=a<=10^5)(虽然这个高度有点扯淡) - 输出
- 首先输出Case num : 表示第几组数据
接下来对于每组数据输出最少的装订次数 - 样例输入
58 2 7 3 11100
- 样例输出
Case 1: 3Case 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 <iostream>#include <cstdio>#include <string.h>using namespace std;int main(){ const int maxn=1005; int n,cnt=0; while(scanf("%d",&n)!=EOF) { int high[maxn],sum[maxn],hmax[maxn]; sum[0]=0,hmax[0]=0; for(int i=1; i<=n; i++) { cin>>high[i]; sum[i]=sum[i-1]+high[i]; hmax[i]=max(high[i],hmax[i-1]); } int dp[maxn]; for(int i=0; i<maxn; i++) dp[i]=1e6; dp[0]=dp[1]=0; for(int i=2; i<=n; i++) for(int j=i-1; j>=0; j--) if(hmax[j]<=sum[i]-sum[j]&&dp[i]>dp[j]+i-j-1)//当前j个中最大高度大于等于从j到i的总书高,进行状态转移 { dp[i]=dp[j]+i-j-1;//更新dp hmax[i]=sum[i]-sum[j];////更新前i摞书中最高的书高高度 break; } cnt++; cout<<"Case "<<cnt<<": "<<dp[n]<<endl; } return 0;}
0 0
- 整理图书
- 历届JOLT图书奖整理
- nyoj-1216-整理图书-dp
- NYOJ 整理图书(动态规划)
- nyoj 1216 整理图书(dp)
- nyoj 整理图书 1216 (DP)
- 图书
- 图书
- 图书
- 图书
- 图书
- 图书
- 一生受益的书:历届JOLT图书奖整理
- Java算法---马戏团和整理图书编程题
- 图书收集和整理技巧汇总【持续更新…
- 向全国推荐优秀古籍整理图书活动入选书目公示(zz)
- 程序员必备:100本免费编程图书以及整理IT网站
- 图书商城:图书模块
- js 导出excel,设置下载的标题
- Linux Socket套接字
- mysql忘记密码修改方法
- 如何搭建局域网共享文件
- C++:STL标准入门汇总
- 整理图书
- deepLink iOS 应用到自己APP 记录
- Cohen-Sutherland直线段的裁剪算法
- Linux网络配置及SecureCRT终端的使用
- 【Python】BeautifulSoup使用
- 使用AsyncTask进行异步加载
- zabbx用微信接收告警
- 7Liveasia Casino Baccarat Challenge
- Android开发之手机适配工具类