1. 程式人生 > >codeforces C. Functions again

codeforces C. Functions again

map efi ios 連續 eps cti n) space log

  題意:給定了一個公式,讓你找到一對(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(); } }

codeforces C. Functions again