Running(POJ-3661)
Problem 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 of Di (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 2
5
3
4
2
10
Sample Output
9
題意:在賽道跑n分鐘,每分鐘可以選擇跑或者休息,以分鐘i跑時會跑完Di的距離但疲勞因子會+1,如果休息,每分鐘疲勞因子會-1,但要減到0才能再次跑。疲勞因子不會超過m,在n分鐘結束后,疲勞因子必須為0,求最大距離。
思路
是一個區間dp題,用f[i][j]表示第i分鐘疲勞值為j時的最大值,由于每分鐘有休息或者跑兩種狀態,此時就要用分治的思想,來分別考慮跑和休息時的狀態轉移方程。
當選擇跑時,當前分鐘的最大值由上一分鐘的最大值決定,故有:f[i][j]=f[i-1][j-1]+D[i]
當選擇休息時有:當前狀態的最大值由前面決定開始休息的時間點i-j決定,故有:f[i][0]=max{ d[i-j][j] },j<=m
Source Program
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 10001 #define MOD 2520 #define E 1e-12 using namespace std; int f[N][501],d[N]; int main() {int n,m;while(scanf("%d%d",&n,&m)!=EOF){memset(f,0,sizeof(f));for(int i=1;i<=n;i++)scanf("%d",&d[i]);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)//跑f[i][j]=f[i-1][j-1]+d[i];f[i][0]=f[i-1][0];for(int j=1;j<=i&&j<=m;j++)//休息f[i][0]=max(f[i][0],f[i-j][j]);}printf("%d\n",f[n][0]);}return 0; }?
總結
以上是生活随笔為你收集整理的Running(POJ-3661)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组合数学 —— 卡特兰数列(Catala
- 下一篇: 八皇后问题 (信息学奥赛一本通-T121