计蒜客 难题题库 222 疲倦程度
2015-08-11 09:17
120 查看
27次
3.70%
1000ms
65536K
奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息。若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0)。若她在第i分钟休息,则疲倦程度减少1。无论何时,疲倦程度都不能超过M。另外,一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步。在第N分钟后,她的疲倦程度必须为0。
输入格式:
第一行,两个整数,代表N和M。 接下来N行,每行一个整数,代表D_i。
输出格式:
Bessie想知道,她最多能跑的距离。
N < = 2000 , M < = 500 , D_i < = 1000
输出:
3.70%
1000ms
65536K
奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息。若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0)。若她在第i分钟休息,则疲倦程度减少1。无论何时,疲倦程度都不能超过M。另外,一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步。在第N分钟后,她的疲倦程度必须为0。
输入格式:
第一行,两个整数,代表N和M。 接下来N行,每行一个整数,代表D_i。
输出格式:
Bessie想知道,她最多能跑的距离。
N < = 2000 , M < = 500 , D_i < = 1000
样例1
输入:5 2 5 3 4 2 10
输出:
9
/* 下面的程序不满足 一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步 #include<iostream> using namespace std; const int maxn = 2002; const int maxm = 502; int d[maxn]; int dp[maxn][maxm]; // dp[i][j] 表示前 i 分钟结束,疲劳程度为 j 能跑的最远距离 int main(){ int n, m; cin >> n >> m; int i, j; for(i = 1; i <= n; ++i){ cin >> d[i]; } for(i = 1; i <= n; ++i){ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]); for(j = 1; j < m; ++j){ dp[i][j] = max(d[i] + dp[i - 1][j - 1], dp[i - 1][j + 1]); } dp[i][m] = d[i] + dp[i - 1][j - 1]; } cout << dp [0] << endl; } */ #include<iostream> using namespace std; const int maxn = 10010; // 骗子,说好的 N <= 2000的呢? const int maxm = 510; int d[maxn]; int dp[maxn][maxm][2]; // dp[i][j][0] 表示第 i 分钟不跑的话,前 i 分钟结束,疲劳程度为 j 能跑的最远距离 // dp[i][j][1] 表示第 i 分钟跑的话,前 i 分钟结束,疲劳程度为 j 能跑的最远距离 int main(){ int n, m; cin >> n >> m; n = min(n, maxn - 1); m = min(m, maxm - 1); int i, j; for(i = 1; i <= n; ++i){ cin >> d[i]; } for(i = 1; i <= n; ++i){ // 不跑 // 第 i 分钟不跑,结束时疲惫程度为 0 dp[i][0][0] = max(max(dp[i - 1][0][0], dp[i - 1][1][0]), max(dp[i - 1][0][1], dp[i - 1][1][1]) ); // 第 i 分钟不跑,结束时疲惫程度为 j for(j = 1; j < m; ++j){ dp[i][j][0] = max(dp[i - 1][j + 1][0], dp[i - 1][j + 1][1]); } // 第 i 分钟不跑,结束时疲惫程度为 m,不可能 dp[i][m][0] = 0; // 跑 // 第 i 分钟跑,结束时疲惫程度为 0,不可能 dp[i][0][1] = 0; // 第 i 分钟跑,结束时疲惫程度为 1,前一分钟只能没跑,且疲劳程度为 0 dp[i][1][1] = d[i] + dp[i - 1][0][0]; // 第 i 分钟跑,结束时疲惫程度为 j,j >= 2, j - 1 >= 1,所以第 i - 1 分钟只能跑 for(j = 2; j <= m; ++j){ dp[i][j][1] = d[i] + dp[i - 1][j - 1][1]; } } cout << dp [0][0] << endl; }
相关文章推荐
- 锂电池的充电电压和电流应该是多少
- A1029. Median (25)
- 变量声明相关
- 时间处理工具类DateUtils
- uiwebview与js交互
- EF 多线程插入 Insert into DbContext Multithreading
- 计蒜客 难题题库 221 N的-2进制表示
- [J2EE]命令行删除、安装tomcat服务器
- 15-StringBuffer-10-常用对象API(StringBuffer类-插入&删除&查找&修改)
- MySQL5.6 新特性之GTID
- Spring+Quartz实现定时任务的配置方法
- BZOJ3289: Mato的文件管理
- HDU4336 Card Collector【容斥原理】
- Android UI 主线程,啥玩意?还有Handler+Looper+MessageQueue几个意思?
- uva 10129 Play On Words(并查集法和DFS法)
- 计蒜客 难题题库 220 线段的总长
- Struts2 Hello World 实例
- mov eax, dword ptr [esi]指令区别
- 结构的具体说明sublime text 2/3的Golang开发环境
- PHP5.3安装Zend Guard Loader代替Zend Optimizer