码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ_1613_ [Usaco2007_Jan]_Running_贝茜的晨练计划_(动态规划)

时间:2016-06-11 00:43:53      阅读:471      评论:0      收藏:0      [点我收藏+]

标签:

描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1613

n分钟,疲劳值上限是m,开始时疲劳值为0.第i分钟可以跑d[i]米.在某一时刻,如果疲劳值小于上限,可以选择跑步,增加1疲劳值.随时可以休息,每分钟减少1疲劳值,但必须休息到疲劳值为0.第n分钟时疲劳值必须是0,.求最多跑多少米.

 

分析


弱鸡我自己想的dp方程,好像有点复杂...

用\(dp[i][j][k]\)表示第i分钟,疲劳值为j,状态为k时的最有解.其中k=0表示选择休息,k=1表示选择跑步.

则有

\(dp[i][j][1]=dp[i-1][j-1][1]\),

\(dp[i][j][0]=max(dp[i-1][j+1][0],dp[i-1][j+1][1]\),

\(dp[i][0][0]=d[i][0][1]=max\{dp[i-1][0][0],dp[i-1][0][1],dp[i-1][1][0],dp[i-1][1][1]\}\)

 

p.s.相约普及组系列...

 

技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=10000+5,maxm=500+5;
 5 int n,m;
 6 int d[maxn];
 7 int dp[maxn][maxm][2];
 8 int main(){
 9     scanf("%d%d",&n,&m);
10     for(int i=1;i<=n;i++) scanf("%d",&d[i]);
11     for(int i=0;i<n;i++){
12         int M=min(m,i);
13         for(int j=0;j<=M;j++){
14             if(j>1) dp[i+1][j-1][0]=max(dp[i][j][0],dp[i][j][1]);
15             else dp[i+1][0][0]=dp[i+1][0][1]=max(dp[i+1][0][0],max(dp[i][j][0],dp[i][j][1]));
16             if(j<m) dp[i+1][j+1][1]=dp[i][j][1]+d[i+1];
17         }
18     }
19     printf("%d\n",dp[n][0][0]);
20     return 0;
21 }
View Code

 

BZOJ_1613_ [Usaco2007_Jan]_Running_贝茜的晨练计划_(动态规划)

标签:

原文地址:http://www.cnblogs.com/Sunnie69/p/5574452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!