描述
John的奶牛们计划要跳到月亮上去。它们请魔法师配制了P(1 <= P <=150,000)种药水,这些药水必需安原来的先后次序使用,但中间可以跳过一些药水不吃。每种药水有一个“强度”值 s ( 1 <= s <= 500 ),表示可以增强牛的跳跃能力。然而,药力的作用却是交替相反方向起作用,也就是说:当第奇数次吃药时,牛获得跳的更高的能力,而第偶数吃药时,却降低了跳高能力。在吃药前,牛的跳高能力当然为 0 。
每种药只能吃一次,开始时为第1次吃药。
请求出牛可能跳到的最高高度--最大跳跃能力。
输入
第一行:一个整数P
下面P行:每行一个整数,表示按先后次序要吃的药水的“强度”。
输出
只一个整数,表示最大弹跳能力。
输入样例 1
8 7 2 1 8 4 3 5 6
输出样例 1
17
提示
去掉第2、4两种药水,吃药为:7,1,8,3,6;最终能力为:7-1+8-3+6=17
很明显是一个dp
主要有两个状态 第一个是当前取到第几个物品了 第二个是 现在取是加还是减
定义 1为现在取为加
#include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cstring> #include<iostream> #include<queue> using namespace std; //input #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s) #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) // #define N 150000 int dp[N][2]; int a[N]; int main() { CLR(dp,0); int n; RI(n); for(int i=1;i<=n;i++) RI(a[i]); dp[1][1]=a[1]; dp[1][0]=0; for(int i=2;i<=n;i++) { //选 dp[i][1]=dp[i-1][0]+a[i]; dp[i][0]=dp[i-1][1]-a[i]; dp[i][1]=max(dp[i][1],dp[i-1][1]); dp[i][0]=max(dp[i][0],dp[i-1][0]); } cout<<max(dp[n][1],dp[n][0]); }