题目链接:http://codeforces.com/contest/789/problem/C
题意:给你n个数组成的数列,a1,a2。。。。。然后定义。让你求最大的f。
分析:这种题一看就是以前的基础DP,求数列最大连续和。这个题只需要对于每一个a[i]求出b[i]=abs(a[i]-a[i+1]),然后按分成两个数列,一个是奇数项为-b[i],一个偶数项为-b[i].然后求两个数列最大连续和,取 max。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 long long a[100005]; 5 long long ab1[100005]; 6 long long ab2[100005]; 7 int main() { 8 ios_base::sync_with_stdio(0); 9 cin.tie(0); 10 int n; 11 cin>>n; 12 for(int i=1;i<=n;i++){ 13 cin>>a[i]; 14 } 15 for(int i=1;i<n;i++){ 16 if(i%2==1) { 17 ab1[i]=abs(a[i]-a[i+1]); 18 ab2[i]=-ab1[i]; 19 } 20 else { 21 ab1[i]=-abs(a[i]-a[i+1]); 22 ab2[i]=-ab1[i]; 23 } 24 } 25 long long result=0; 26 long long num=0; 27 for(int i=1;i<n;i++){ 28 if(num+ab1[i]>0){ 29 num=num+ab1[i]; 30 result=max(result,num); 31 } 32 else num=0; 33 } 34 num=0; 35 for(int i=1;i<n;i++){ 36 if(num+ab2[i]>0){ 37 num=num+ab2[i]; 38 result=max(result,num); 39 } 40 else num=0; 41 } 42 cout<<result<<endl; 43 44 45 46 return 0; 47 }