BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
題目
1613: [Usaco2007 Jan]Running貝茜的晨練計劃
Time Limit:?5 Sec??Memory Limit:?64 MBDescription
奶牛們打算通過鍛煉來培養自己的運動細胞,作為其中的一員,貝茜選擇的運動方式是每天進行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 25
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 10000000000LLinline 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; }
轉載于:https://www.cnblogs.com/WNJXYK/p/4063926.html
總結
以上是生活随笔為你收集整理的BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Angular16 Angular整合z
- 下一篇: DMZ的原理与应用