codeforces C. Functions again
阿新 • • 發佈:2017-08-04
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