疲劳奔跑,求最长跑了多少
一开始没有看到题目的特殊性,一旦休息,就一直休息直到疲劳度为0
dp[i][j] i表示到第i个跑点,j表示当时的疲劳度时最大,WA
其实考虑了特殊性就是0,1背包了
add[i]表示1-i的和
dp[i]=max(dp[i],dp[i-j*2]+add[i-j]-add[i-2*j]);
View Code
#include<stdio.h>
int dp[10009];
int add[10009];
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,temp;
add[0]=0;
dp[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&temp);
add[i]=add[i-1]+temp;
dp[i]=0;
}
for(i=1;i<=n;i++)
{
dp[i]=dp[i-1];
for(j=1;j<=m;j++)
{
if((i-2*j)>=0)
dp[i]=max(dp[i],dp[i-2*j]+add[i-j]-add[i-2*j]);
else
break;
}
}
printf("%d\n",dp[n]);
}
}