牛跳

题目描述

John的奶牛们计划要跳到月亮上去。它们请魔法师配制了P(1 <= P <=150,000)种药水,这些药水必需安原来的先后次序使用,但中间可以跳过一些药水不吃。每种药水有一个“强度”值 s ( 1 <= s <= 500 ),表示可以增强牛的跳跃能力。然而,药力的作用却是交替相反方向起作用,也就是说:当第奇数次吃药时,牛获得跳的更高的能力,而第偶数吃药时,却降低了跳高能力。在吃药前,牛的跳高能力当然为 0 。

    每种药只能吃一次,开始时为第1次吃药。

    请求出牛可能跳到的最高高度--最大跳跃能力。

输入

第一行:一个整数 P

下面P行:每行一个整数,表示按先后次序要吃的药水的“强度”。

输出

只一个整数,表示最大弹跳能力。

样例输入

8
7
2
1
8
4
3
5
6

样例输出

17

提示

去掉第2、4两种药水,

吃药为:

7,1,8,3,6;

最终能力为:

7-1+8-3+6=17

代码

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=(j);i<=(k);++i)
using namespace std;
int n, a[150001];
int f[150001][2];
//f[i][0]表示到第i瓶为止 总共已经喝了奇数瓶 
//f[i][1]表示到第i瓶为止 总共已经喝了偶数瓶
template<class T> inline void read(T &x) {
    x=0;
    register char c=getchar();
    register bool f=0;
    while(!isdigit(c))f^=c=='-',c=getchar();
    while(isdigit(c))x=x*10+c-'0',c=getchar();
    if(f)x=-x;
}
int main() {
    read(n);
    rep(i, 1, n) {
        read(a[i]);
    }
    f[1][0] = a[1];
    f[1][1] = 0;
    rep(i, 2, n) {
        f[i][0] = max(f[i - 1][0], f[i - 1][1] + a[i]);
        f[i][1] = max(f[i - 1][1], f[i - 1][0] - a[i]);
    }
    printf("%d\n", max(f[n][0], f[n][1]));
    return 0;
}
posted @ 2020-04-11 11:56  牛大了的牛大  阅读(237)  评论(0编辑  收藏  举报