题意:Array b 有n-1个数,选择从某个数开始,每次- + - + - + , 求最大连续子段和
思路:
1.对于每个数正负号确定的情况下,出门搜:DP求解最大连续子段和
2.那么序列B的每个数无非是 + or - , 求出相应的数组求最大连续zui段和
#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e5+5;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
ll a[N];
ll b[N];
ll c[N];
int main(void){
    int n;
    cin >>n;
    for(int i=1;i<=n;i++)   scanf("%I64d",&a[i]);
    for(int i=1;i<=n-1;i++){
        b[i]=abs(a[i]-a[i+1]);
        if(i%2==0)  b[i]=-b[i] ;
    }
    for(int i=1;i<=n-1;i++)
        c[i]=-b[i];
    ll mx=0,sum=0;
    for(int i=1;i<=n-1;i++){
        sum+=b[i];
        if(sum<0)   sum=0;
        mx=max(mx,sum);
    }
    sum=0;
    for(int i=1;i<=n-1;i++){
        sum+=c[i];
        if(sum<0)   sum=0;
        mx=max(mx,sum);
    }
    cout << mx << endl;
    return 0;
}
 
京公网安备 11010502036488号