codeforces C. Functions again

  题意:给定了一个公式,让你找到一对(l,r),求解出公式给定的F值。

  当时没有想到,我把(-1)^(i-l)看成(-1)^i,然后思路就完全错了。其实这道题是个简单的dp+最长连续子序列。

  O(n)求最长连续子序列代码

    ll maxx=0, sum=0, now=0;
    for (int i=1; i<n; i++) {    //数列1-n
        sum+=dp1[i];
        maxx=max(maxx, sum);
        if (sum<0)  sum=0;
    }

  其实我们可以发现,其实正负是交错的,那么我们只要用两个dp(正负相反)的数组来存,再求一次最长连续子序列就好了。

/*  gyt
       Live up to every day            */
#include <stdio.h>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>3
#include <queue>
#include <set>
#include <string>
#include <map>
#include <time.h>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 1e5+10;
const ll maxm = 1e7;
const int mod = 1000000007;
const int INF = 1<<30;
const db eps = 1e-9;
const ll Max=1e19;
ll a[maxn], dp1[maxn], dp2[maxn];

void solve() {
    int n;  scanf("%d", &n);
    for (int i=1; i<=n; i++) {
        scanf("%lld", &a[i]);
    }
    memset(dp1, 0, sizeof(dp1));
    memset(dp2, 0, sizeof(dp2));
    int f=1;
    for (int i=1; i<=n-1; i++) {
        dp1[i]=abs(a[i]-a[i+1])*f;
        dp2[i]=abs(a[i]-a[i+1])*(-f);
        f = -f;
    }
    ll maxx=0, sum=0, now=0;
    for (int i=1; i<n; i++) {
        sum+=dp1[i];
        maxx=max(maxx, sum);
        if (sum<0)  sum=0;
    }
    sum=0;
    for (int i=1; i<n; i++) {
        sum+=dp2[i];
        maxx=max(maxx, sum);
        if (sum<0)  sum=0;
    }
    cout<<maxx<<endl;
}
int main() {
    int t=1;
    //freopen("in.txt", "r", stdin);
    //scanf("%d", &t);
    for (int T=1; T<=t; T++) {
        solve();
    }
}
原文地址:https://www.cnblogs.com/gggyt/p/7286882.html