1.
running(PKU 3661)
这道题目是一道动态规划(DP)题。
状态转移方程为:
(dp[i][j]表示在第i分钟结束时有体力j)
dp[i][j]=dp[i-1][j-1]+d[i] (j>0)
dp[i][0]=max{dp[i-j][j],dp[i-1][0]} (i-j>=j,j<=m)
为什么这样写呢?
后面一个方程比较好理解,j=0肯定是从前面已知休息得来的。
前面一个方程为什么不可能是dp[i][j]=dp[i-1][j+1]呢,因为这种情况已经包含在下面一个方程里了(注意,要休息必须已知休息到j=0)

code

#include <stdio.h>
int dp[10001][501];
int n,m,i,j;
int max(int i,int m)


{
int ma=dp[i-1][1];
for (int j=2;j<=m && i-j>=j;j++)
if (dp[i-j][j]>ma)
ma=dp[i-j][j];
if (dp[i-1][0]>ma)
ma=dp[i-1][0];
return ma;
}
int main()


{
scanf("%d%d",&n,&m);
int d[10001];
for (i=1;i<=n;i++)
scanf("%d",&d[i]);
for (i=0;i<501;i++)
dp[i][0]=0;
for (i=1;i<=n;i++)

{
for (j=1;j<=m && j<=i;j++)
dp[i][j]=dp[i-1][j-1]+d[i];
dp[i][0]=max(i,m);
}
printf("%d\n",dp[n][0]);
return 0;
}