BZOJ 1613: [Usaco2007 Jan]Running貝茜的晨練計劃


題目


1613: [Usaco2007 Jan]Running貝茜的晨練計劃

Time Limit: 5 Sec  Memory Limit: 64 MB

Description

奶牛們打算通過鍛鍊來培養自己的運動細胞,作爲其中的一員,貝茜選擇的運動方式是每天進行N(1 <= N <= 10,000)分鐘的晨跑。在每分鐘的開始,貝茜會選擇下一分鐘是用來跑步還是休息。 貝茜的體力限制了她跑步的距離。更具體地,如果貝茜選擇在第i分鐘內跑步,她可以在這一分鐘內跑D_i(1 <= D_i <= 1,000)米,並且她的疲勞度會增加 1。不過,無論何時貝茜的疲勞度都不能超過M(1 <= M <= 500)。如果貝茜選擇休息,那麼她的疲勞度就會每分鐘減少1,但她必須休息到疲勞度恢復到0爲止。在疲勞度爲0時休息的話,疲勞度不會再變動。晨跑開始時,貝茜的疲勞度爲0。 還有,在N分鐘的鍛鍊結束時,貝茜的疲勞度也必須恢復到0,否則她將沒有足夠的精力來對付這一整天中剩下的事情。 請你計算一下,貝茜最多能跑多少米。

Input

* 第1行: 2個用空格隔開的整數:N 和 M

* 第2..N+1行: 第i+1爲1個整數:D_i

Output

* 第1行: 輸出1個整數,表示在滿足所有限制條件的情況下,貝茜能跑的最大 距離

Sample Input

5 2
5
3
4
2
10


Sample Output

9

輸出說明:

貝茜在第1分鐘內選擇跑步(跑了5米),在第2分鐘內休息,在第3分鐘內跑
步(跑了4米),剩餘的時間都用來休息。因爲在晨跑結束時貝茜的疲勞度必須
爲0,所以她不能在第5分鐘內選擇跑步。


題解


這道題一開始用主動轉移竟然Wa了,爲了珍惜提交次數,我還是寫了被動轉移。f[i][j]表示i分鐘j的疲勞能做到的最大距離。

方程

f[i][j]=max(f[i][j],f[i-1][j-1]+di[i]) 

f[i][0]=max(f[i][0],f[i-j][j])


代碼


/*Author:WNJXYK*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;

#define LL long long
#define Inf 2147483647
#define InfL 10000000000LL

inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
inline void swap(LL &x,LL &y){LL tmp=x;x=y;y=tmp;}
inline int remin(int a,int b){if (a<b) return a;return b;}
inline int remax(int a,int b){if (a>b) return a;return b;}
inline LL remin(LL a,LL b){if (a<b) return a;return b;}
inline LL remax(LL a,LL b){if (a>b) return a;return b;}

int n,m;
int di[10005];
int f[10005][505];
int main(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%d",&di[i]);
	memset(f,-127,sizeof(f));
	f[0][0]=0;
	for (int i=1;i<=n;i++){
		f[i][0]=f[i-1][0];
		for (int j=1;j<=m;j++){
			if (j<i) f[i][0]=remax(f[i][0],f[i-j][j]);
			f[i][j]=remax(f[i][j],f[i-1][j-1]+di[i]);
		}
	}
	printf("%d\n",f[n][0]);
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章