背包——[Usaco2007 Jan]Running POJ3661

疲劳奔跑,求最长跑了多少

一开始没有看到题目的特殊性,一旦休息,就一直休息直到疲劳度为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]);
}
}



你可能感兴趣的:(USACO)