题意: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; }