1. 程式人生 > >Codeforces 789 C Functions again DP

Codeforces 789 C Functions again DP

int iter 子序列 con closed print name for sca

  題目鏈接: http://codeforces.com/problemset/problem/789/C

  題目描述: 給定一個數列, 問從某項開始加一項減一項的最大值是多少

  解題思路: 先把數列分成兩種情況, 一種是第一個正第二個負第三個正...... 一種是第一個負第二個正第三個負...... DP求一個連續子序列最大和就可以了

  代碼:

技術分享
#include <iostream>
#include <cstdio>
#include <map>
#include <iterator>
#include <string>
#include 
<algorithm> #include <vector> #include <cmath> #include <cstring> using namespace std; typedef long long ll; const ll maxn = 1e5+10; ll a[maxn]; ll b[maxn]; ll c[maxn]; ll d[maxn]; ll solve( ll * p, ll len ) { ll ans = 0; ll cnt = 0; for( ll i = 1; i <= len; i++ ) { cnt
+= p[i]; if( cnt < 0 ) cnt = 0; else { if( cnt > ans ) ans = cnt; } } return ans; } int main() { ll n; scanf( "%lld", &n ); for( ll i = 1; i <= n; i++ ) { scanf( "%lld", a+i ); } for( ll i = 1; i <= n-1; i++ ) { b[i]
= abs(a[i+1]-a[i]); } n--; for( ll i = 1; i <= n; i++ ) { if( i & 1 ) { c[i] = -b[i]; d[i] = b[i]; } else { c[i] = b[i]; d[i] = -b[i]; } } printf( "%lld\n", max(solve(c,n), solve(d, n))); return 0; }
View Code

  思考: 訓練自己的代碼能力與將問題抽象出來的能力

Codeforces 789 C Functions again DP