Poj3661 Usaco2008JanSilver Running
来源:互联网 发布:python归并排序算法 编辑:程序博客网 时间:2024/06/05 17:33
题目大意
奶牛们想要变成更强的运动员,所以Bessie开始了一项N分钟的训练,在每分钟,她可以选择跑步或者休息1整分钟
Bessie所能奔跑的极限距离,取决于她的“疲劳值”,一个一开始是0的值。当她选择在第i分钟奔跑时,她将会跑
N分钟的锻炼结束后,Bessie的疲劳值必须为0,不然她没有剩余的精力来应对剩下的一天。
算出Bessie能跑多远?
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 2
5
3
4
2
10
Sample Output
9
Bessie走了i分钟,疲劳值为j,状态中不同的i会有不同的j,所以开二维数组
因而设dp[i][j]为Bessie走了i分钟疲劳值为j时的最远距离,这样问题就转换为求dp[n][0],也可以拆分出许多子问题
转移上是
先考虑选择跑步的状态
dp(i,j)=dp(i−1,j−1)+d[i](第i分钟选择走,疲劳值+1)
再考虑选择休息的状态,考虑到如何把疲劳值降为0不如反过来,考虑dp(i,0)是怎样转移过来的,是从什么地方开始下降,导致了疲劳值为0?
dp(i,0)=dp(i−1,0)(第i−1分钟疲劳值也是0,第i分钟依然休息) dp(i,0)=dp(i−k,k)(i−k>0且k<=m)(从第i−k分钟开始休息,一直休息了k分钟)
#include <iostream> #include <cstdio> #include <algorithm>using namespace std; int n,dp[100010][510],m,d[100010];long long ans;int main() { cin >> n >> m; for(int i=1; i<=n; i++) cin >> d[i]; for(int i=1; i<=n; i++) { dp[i][0] = dp[i-1][0]; for(int j=1; j<=m && j<=i; j++) dp[i][j] = dp[i-1][j-1] + d[i]; for(int k=1; k<=m&&i-k>0; k++) dp[i][0] = max(dp[i][0],dp[i-k][k]); } cout << dp[n][0]; return 0;}
阅读全文
0 0
- Poj3661 Usaco2008JanSilver Running
- poj3661 Running
- poj3661 Running
- POJ3661 Running 动规
- POJ3661——Running
- POJ3661 Running 【动态规划】
- poj3661
- poj3661
- poj3661,dp
- Poj3662 Usaco2008JanSilver Telephone Lines
- POJ3661 背包DP
- poj3661 区间dp
- running
- Keep Running
- Running IPv6
- poj running
- OpenCV running
- Running NWCHEM
- ubuntu14_64位 编译 unity-mono
- 实现LOL游戏中英雄技能的释放
- Java 对一个带空格的字符串进行排序
- Okhttp的简单二次封装
- poj3181 完全背包+整数拆分
- Poj3661 Usaco2008JanSilver Running
- shell 变量
- 八皇后问题
- 【PAT】【Advanced Level】1108. Finding Average (20)
- 3sum问题解决方案
- Hbase shell scan
- soap 简单实用
- bzoj1000 A+B Problem
- 1012 card card card