C - Functions again
题意:
给出一个序列,定义一个区间函数为:
求出最大的值。
思路:
直接求没有办法求出,思考其公式,假如最终答案是区间l,r,其和最大,那么必然是正负正负正的形式,所以只需求出所有的正负情况,然后求出区间的最大子序列和即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <cstdlib>
using namespace std;
const int maxn = 1e5+10;
typedef long long LL;
int n;
LL a[maxn],b[maxn],c[maxn];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i = 1;i <= n; i++) {
scanf("%I64d",&c[i]);
}
for(int i = 1;i < n; i++) {
if(i%2) {
a[i] = abs(c[i]-c[i+1]);
b[i] = -abs(c[i]-c[i+1]);
}
else {
a[i] = -abs(c[i]-c[i+1]);
b[i] = abs(c[i]-c[i+1]);
}
}
LL ans = 0,sum = 0;
for(int i = 1;i < n; i++) {
sum += a[i];
if(sum > ans) ans = sum;
if(sum < 0) sum = 0;
}
sum = 0;
for(int i = 1;i < n; i++) {
sum += b[i];
if(sum > ans) ans = sum;
if(sum < 0) sum = 0;
}
printf("%I64d\n",ans);
return 0;
}