牛最大跳跃能力问题,dp。

大概题意是有P瓶魔法药水。在某个时间可以跳过不吃,吃了就不能吃之前的药,当它跳的是第奇数步,跳的高度增加,如果是第偶数步,跳得高度就减少.问怎样合理安排,让牛跳得更高?
Sample Input
8
7
2
1
8
4
3
5
6
Sample Output
17
题解:这个题目重点就是奇数步加偶数步减,难点就是可以跳过并且不能选之前的,所以要分类讨论,分解成每次两个dp一个选完p瓶药是记录奇数步吃的药,一个是记录选完p瓶药偶数步吃的药。再在这两个dp里取得最大跳跃能力。如果是贪心解题的话应该是每两两比较选取最大的,把他们的两两最大的差加起来就行了。
#include< iostream >
#include< cstdio >
using namespace std;
int dp[155555][2];//第一维是前i次累积跳跃,0是偶数步1是奇数步。
int main()
{
int P,i,n;
while(scanf("%d",&P)!=EOF)
{
dp[0][0]=0;//未吃药的跳跃
dp[0][1]=0;
for (i=1;i<=P;i++)
{
scanf("%d",&n);
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-n);//相当于前面i-1项奇数步药累积。
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+n);//相当于前面i-1项偶数步药累积。
}
printf("%d\n",max(dp[P][0],dp[P][1]));
}
}

发布了23 篇原创文章 · 获赞 0 · 访问量 335

猜你喜欢

转载自blog.csdn.net/qq_45762392/article/details/105081297