nyoj 1216 整理图书(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
第二组样例:只有一本书,无需装订
-
解题思路:这道题最开始作死。。。自己yy了一个状态dp[i][j]表示前i个序列装订了j次最大高度的最小值,那么这里需要3层for循环,加上一些剪枝。。然后超时。。
-
#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 1005; const int inf = 0x3f3f3f3f; int n,a[maxn],sum[maxn]; int dp[maxn][maxn];int main() {int cas = 1,i,j,k;while(scanf("%d",&n)!=EOF){for(i = 1; i <= n; i++){scanf("%d",&a[i]);sum[i] = sum[i-1] + a[i];}memset(dp,inf,sizeof(dp));dp[0][0] = 0;dp[1][0] = a[1];for(i = 2; i <= n; i++)for(j = 0; j < i; j++){for(k = 0; k <= j; k++){if(sum[i] - sum[i-k-1] >= dp[i-k-1][j-k]){dp[i][j] = sum[i] - sum[i-k-1];break;}}if(k <= j) break;}for(int i = 0; i < n; i++)if(dp[n][i] != inf){printf("Case %d: %d\n",cas++,i);break;}}return 0; }
其实这里不需要这么麻烦,直接dp[i]表示前i个序列的最小整理次数,那么我们只需要维护一个当前的最大高度h即可,因为这个h一定是最后一次装订时可以确定的,那么直接维护h即可找到最小的装订次数。比我之前那个状态又优化了很多。
-
#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摞书非降序时需要最少装订次数为0dp[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; //更新dph[i] = sum[i] - sum[j]; //更新前i摞书中最高的书高高度break;}}}}printf ("*Case %d: %d\n",++cnt, dp[n] );}return 0; }
nyoj 1216 整理图书(dp)相关推荐
- RFID智能书架,整理图书不再烦恼
一直以来,图书盘点,查找,图书整理上架都属于比较繁重的工作,需要大量的时间,人力去完成,不仅浪费时间,也会降低工作人员的积极性,降低读者的满意度,如何解决这些问题一直困扰这图书管理人员. RFID智能 ...
- 1771: 书架整理(dp)
1771: 书架整理 时间限制: 1 Sec 内存限制: 128 MB 题目描述 小明是计算机专业的学生,他想在本科毕业后继续读计算机研究生,于是他决定加入考研大军.所以他准备了非常多的考研复习书,但 ...
- NYOJ 304 节能(DP)
题目描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧上所有的路灯. 卡多每到早晨5:00准会在ZK大道上某盏路灯的旁边,然后他 ...
- NYOJ 309 BOBSLEDDING(dp)
BOBSLEDDING 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong has entered a bobsled competition because ...
- NYOJ 252 01串 dp
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这种长度的0 ...
- NYOJ 229 工程 二分+dp检验
工程 时间限制:1000 ms | 内存限制:65535 KB 描述 有n个工人做两个工程A和B,每个工程都被分为相同的m份,给你第i个工人做A中的一份需要的时间Xi秒,和做B中的一份所需时间Yi ...
- 【转】别人整理的DP大全
为什么80%的码农都做不了架构师?>>> 动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...
- ❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...
- ❤️思维导图整理大厂面试高频数组20: 股票问题IV的dp数组构建和几个重要注意点❤️
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...
最新文章
- Smokeping图表参数说明
- 初识FPGA(一)(初步介绍FPGA)
- C语言//注释使下一行代码失效
- cad文字递增快捷键_十年经验总结,100个CAD快捷键。
- 信息学奥赛一本通(1318:【例5.3】自然数的拆分)
- 使用AspectJ开发AOP更加便捷,你不知道嘛
- Linux 忘记 用户名密码
- 2017和2019对比图刷屏,真实扎心!苹果中国女老板也跟风晒图...
- 编译生成的Apk安装到手机提示应用未安装,需给apk签名
- gstreamer的rtsp推流(笔记)
- jvisualVm用法
- 车辆故障码api DTC查询
- 优秀java程序员必须具备的技术技能
- 智能车图像处理(三)元素判断
- 哪个蓝牙耳机好?盘点2022年600元左右的蓝牙耳机
- 真正从零开始搭建网站—宝塔面板+wordpress(超详细教程)
- 学计算机网络技术遇到问题,维护计算机网络教室的常见问题及解决方案
- python中idx+=1_在Python中为apos;循环访问索引 Dovov编程网
- nmap与hydra
- 基于cp-abe算法的访问控制方法在linux下的实现和算法优化,基于CP-ABE的访问控制研究...