题意:将一天分为N小时,每小时都有一个价值w,有一头牛要睡觉,而它的睡觉是连续的,且第一小时不能算价值,即如果你睡了[a,b],则你获得的收益是w[a+1]+w[a+2]+……+w[b],而这头牛可以每天多次睡(可以理解成选若干个时间段睡觉),不过每天的睡觉总时间数不能超过B,求能获得的最大总收益。(不过值得注意的是,“1天”并不是从0~N-1,而可以是从任何一个小时开始到n小时之后,即可以从N-1睡到0)

一天有N个小时,然后月落日升,昼夜往复,很显然这是一道环状结构上的DP问题,我们一般遇到环状问题时,都是把环状结构拆成一条链,来覆盖拆环方式造成的结果不同。但是这道题,把n变成二倍然后枚举,恐怕会造成时间复杂度过大。所以我们会采用另一种办法!
我们可以简单的想到转移方程
f[i][j][0]代表某天前i小时睡了j小时,且第i小时醒着所能获得的最大体力;
f[i][j][1]表示前i小时睡了j小时,且第i小时正在熟睡所能获得的最大体力!
之后呢,因为我们丢了一种情况,就是这一天的第一个小时我们是可能会处于熟睡状态的,那怎么办呢!
我们可以强行令第一小时就在熟睡状态,并且上一天的第n小时就已经开始睡眠了,这样我们只需要跟上面的结果取最优就好了!赋初值的时候呢,当然就是要把第一小时f[1][1][1]的初值赋成每天第一小时睡觉获得的最大体力咯!
下面上代码!

 1 //看海天一色 听风起雨落
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<string>
 6 #include<cmath>
 7 #include<cstring>
 8 #include<algorithm>
 9 using namespace std;
10 const int MAXN=3835;
11 int f[2][MAXN][2],w[MAXN],ans=0;//f[i][j][0]代表某天前i小时睡了j小时,且第i小时醒着;
12 // f[i][j][1]表示前i小时睡了j小时,且第i小时正在熟睡!
13 //加了一个滚动数组的优化!
14 int n,m,k;
15 int main()
16 {
17     scanf("%d%d",&n,&m);
18     for(int i=1;i<=n;i++){
19         scanf("%d",&w[i]);
20     }
21     if(m==0){
22         puts("0");return 0;
23     }
24     memset(f,-0x3f,sizeof(f));
25     f[1&1][1][1]=0;
26     f[1&1][0][0]=0;//初始化!
27     for(int i=2;i<=n;i++){
28         for(int j=0;j<=m;j++){
29             f[i&1][j][0]=max(f[(i-1)&1][j][1],f[(i-1)&1][j][0]);//对于没熟睡的转移
30             if(j>=1) f[i&1][j][1]=max(f[(i-1)&1][j-1][0],f[(i-1)&1][j-1][1]+w[i]);//熟睡了的转移
31         }
32     }
33     ans=max(f[n&1][m][1],f[n&1][m][0]);
34     memset(f,-0x3f,sizeof(f));
35     f[1&1][1][1]=w[1];//强行让牛在第一个小时就熟睡!这是前文规划中没有的部分;
36     for(int i=2;i<=n;i++){//执行第2次dp,对上面已经执行过的dp作补充!
37         for(int j=0;j<=m;j++){
38             f[i&1][j][0]=max(f[(i-1)&1][j][1],f[(i-1)&1][j][0]);
39             if(j>=1) f[i&1][j][1]=max(f[(i-1)&1][j-1][0],f[(i-1)&1][j-1][1]+w[i]);
40         }
41     }
42     ans=max(ans,f[n&1][m][1]);//两次取最优!
43     printf("%d",ans);
44     puts("");
45     return 0;
46 }

View Code

转载于:https://www.cnblogs.com/Alan-Luo/articles/8723341.html

POJ2228 Naptime 【例题精讲】相关推荐

  1. l2-004 这是二叉搜索树吗?_LeetCode 例题精讲 | 11 二叉树转化为链表:二叉树遍历中的相邻结点...

    本期例题: LeetCode 98. Validate Binary Search Tree 验证二叉搜索树(Medium) LeetCode 426. Convert Binary Tree to ...

  2. led伏安特性实验误差分析_高中物理 | 电学实验满分知识点总结+拓展+例题精讲,罕见的好资料,收藏不亏!...

    在物理的学习过程中,电学实验是必考题,很多同学是"遇到就怕".而物理又是高中比较重要的学科,电学是物理一个重要的知识点,所以要想学好物理,电学部分就必须掌握好. 在高中的物理学习中 ...

  3. acm新手小白必看系列之(5)——枚举进阶例题精讲

    acm新手小白必看系列之(5)--枚举进阶例题精讲 1.牛奶碑文(暴力枚举) 小伟暑假期间到大草原旅游,在一块石头上发现了一些有趣的碑文.碑文似乎是一个神秘古老的语言,只包括三个大写字母 C.O 和 ...

  4. 数字电路实验怎么接线视频讲解_【高中物理】电学实验满分知识点总结及例题精讲...

    电学实验最全知识点总结 一.实验的考查内容 (1)测定金属的电阻率(练习使用螺旋测微器): (2)描绘小灯泡的伏安特性曲线: (3)测定电源的电动势和内阻: (4)练习使用多用电表: (5)传感器的简 ...

  5. c++链表形参丢失_LeetCode 例题精讲 | 01 反转链表:如何轻松重构链表

    本期例题:LeetCode 206 - Reverse Linked List(Easy) 反转一个单链表.示例: 输入: 1->2->3->4->5->NULL 输出: ...

  6. LeetCode 例题精讲 | 08 排列组合问题:回溯法的候选集合

    点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自面向大象编程 本期例题:LeetCode 46 - Permutations[1]( ...

  7. LeetCode 例题精讲 | 05 双指针×链表问题:快慢指针

    点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自面向大象编程 本期例题: LeetCode 876 - Middle of the ...

  8. 弹性碰撞后速度方向_高中物理竞赛典型例题精讲——垫圈弹性碰撞后速度方向...

    04-07-16_垫圈弹性碰撞后速度方向 本期高中物理竞赛试题,我们来看一下非对心正碰情况下的物体运动状态,并且考虑在题目中给出的特殊情况下的物体运动状态的控制方法,其实对于碰撞以后的物体的运动状态的 ...

  9. python弹性碰撞次数圆周率_高中物理竞赛典型例题精讲——盒内滑块弹性碰撞次数...

    04-07-08_盒内滑块弹性碰撞次数 本期高中物理竞赛试题,我们共同来研究一下弹性碰撞过程与摩擦阻力作用下的运动相结合的题目的解题思路和方法,从这里也就能够明确,本期题目的主要考查重点在两个位置,其 ...

最新文章

  1. C++对象模型9——临时对象的生命周期、模板及实例化分析、内联函数
  2. The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
  3. tf.reduce_max()函数的用法详解
  4. CRM BP attachment read debug
  5. 道理我都懂,但你到底为什么偏偏喜欢咬我??
  6. 计算机中桌面指的是什么情况,windows的桌面是指什么
  7. 《python基础教程(第二版)》学习笔记 基础部分(第1章)
  8. python中读取和保存图片的方法对比
  9. Mycat实战之配置EP分片
  10. 国内外组态软件对比分析(InTouch、WinCC、iFix、iNeuOS)
  11. 计算机专业买笔记本要机械硬盘吗,买笔记本电脑要注意什么配置?内存与SSD挑选...
  12. android地图方位角,根据两点经纬度,计算距离、方位角
  13. excel删除无尽空白行_全了!Excel批量插入空行、批量删除空行、隔行插入空行技巧...
  14. [python] python调用C++ 程序
  15. [‘1‘,‘2‘,‘3‘].map(parseInt)结果讲解
  16. element ui中的el-input回车键事件
  17. C++类成员函数指针使用介绍
  18. 一款微信小程序是如何诞生的。
  19. 玩消费电子产品,常用6款传感器不可不知
  20. 搭建简易多人在线视频会议系统

热门文章

  1. 亚马逊10000人大裁员已启动!谷歌绩效强制打低分跟风「毕业潮」
  2. 关于支付宝申请APP支付和网页支付在申请时需要的材料
  3. php周签到功能思路,thinkphp签到功能实现方法
  4. Using R Language to Plot Diagrams
  5. PS某色背景改为透明
  6. 3 分钟带你看懂 Acala EVM
  7. 【CubeMX配置STM32驱动超声波模块(HC-SR04)】
  8. 领英大数据:经济寒冬,“全思维IT工程师”成企业新宠
  9. showModalDialog打开窗口时不跳入新页面设置
  10. openstack-创建多网络虚机