博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【POJ 3661】Running
阅读量:4592 次
发布时间:2019-06-09

本文共 2187 字,大约阅读时间需要 7 分钟。

Running
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5598   Accepted: 2102

Description

The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ≤ N ≤ 10,000) minutes. During each minute, she can choose to either run or rest for the whole minute.

The ultimate distance Bessie runs, though, depends on her 'exhaustion factor', which starts at 0. When she chooses to run in minute i, she will run exactly a distance ofDi (1 ≤ Di ≤ 1,000) and her exhaustion factor will increase by 1 -- but must never be allowed to exceed M (1 ≤ M ≤ 500). If she chooses to rest, her exhaustion factor will decrease by 1 for each minute she rests. She cannot commence running again until her exhaustion factor reaches 0. At that point, she can choose to run or rest.

At the end of the N minute workout, Bessie's exaustion factor must be exactly 0, or she will not have enough energy left for the rest of the day.

Find the maximal distance Bessie can run.

Input

* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: Line i+1 contains the single integer: Di

Output

* Line 1: A single integer representing the largest distance Bessie can run while satisfying the conditions.

 

Sample Input

5 2534210

Sample Output

9

Source

 
题意:从前有一只奶牛叫Bessie,它晨练减肥,以吸引男奶牛(以上纯属脑补)。它要从跑步中得到锻炼。它要跑N分钟,如果跑一分钟步它的疲劳度就会增加1,然而如果要休息,则疲劳度减1,如果它一开始休息就必须休息到疲劳度为0才能重新开始跑。
这是一道很简单的DP题。
设f[n][0]为答案,它可能从f[n - j][j]、f[i - 1][0]这两种状态转移过来,表示它可以从疲劳度为 j 时的第n - j 分钟就开始休息一直休息到第n分钟,后者则是它上一分钟就已经疲劳度为零了,所以不变。
那其余的f[i][j]就可以通过普通的01背包转移。
#include
#include
#include
using namespace std;const int MAXN = 10005;const int MAXM = 505;int d[MAXN];int f[MAXN][MAXM];int n;int m;int main(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) scanf("%d", &d[i]); memset(f, 0, sizeof(f)); for (int i = 1; i <= n; ++i) { f[i][0] = f[i - 1][0]; for (int j = 1; j <= m && j <= i; ++j) { f[i][j] = max(f[i][j], f[i - 1][j - 1] + d[i]); f[i][0] = max(f[i][0], f[i - j][j]); } } printf("%d\n", f[n][0]); return 0;}

 

转载于:https://www.cnblogs.com/albert7xie/p/4749158.html

你可能感兴趣的文章
Snow Footprints CodeForces - 298A
查看>>
Choose and divide UVA - 10375
查看>>
Delete Them
查看>>
JSON跨域原理实现
查看>>
wiringPi 库下用C控制GPIO
查看>>
Excel-单条件和多条件匹配搜索
查看>>
Android bluetooth low energy (ble) writeCharacteristic delay callback
查看>>
Delphi7使用一段时间后抽风提示注册
查看>>
intent介绍
查看>>
css元素垂直居中
查看>>
启用WCF测试客户端(WCF Test Client)的相关技巧
查看>>
用 XML 文件持久化和恢复图片信息
查看>>
完美洗牌算法
查看>>
Redis-数据操作
查看>>
noip 2012 Day2 T2 借教室
查看>>
Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
查看>>
Atitit 常用比较复杂的图像滤镜 attilax大总结
查看>>
给大忙人看的Java核心技术笔记(1、基本的编程结构)
查看>>
C++设计模式:Template Method
查看>>
Exponential-time Algorithm
查看>>