您的位置:首页 > 其它

poj 2181 Jumping Cows ——简单DP

2011-07-30 22:50 381 查看
大意:一群牛想要跳到月亮上面去,但是他们现在跳的能力为零。现在给你一些药水,能改变他们跳的能力。不能改变药水的顺序。当跳奇数跳的时候,就增加,当跳偶数跳的时候就减少。药水是可以跳过不喝的。

先开始想的是把最大值最小值用一个二维数组表示,结果怎么想都想不出来,主要还是想到了要记步数,后来才去看解题报告,上面说什么开个二维数组,可以表示奇数步和偶数步。

选与不选这个问题,在代码里面说明吧~~~

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 150000+10
int a[MAXN];
int dp[MAXN][2];
int max(int a,int b)
{
if(a>b)
return a;
else return b;
}

int main(void)
{
int P;
while(scanf("%d",&P)==1)
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
int i;
for(i=1;i<=P;i++)
scanf("%d",&a[i]);
dp[2][0]=max(0,a[1]-a[2]);//这里的处理挺巧的,我怎么就想不到……
dp[2][1]=max(a[1],a[2]);
for(i=3;i<=P;i++)
{
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-a[i]);//前面就是不选的状态
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+a[i]);
}
printf("%d\n",max(dp[P][0],dp[P][1]));
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: