http://hihocoder.com/problemset/problem/1338
間隔DP。
D [L] [R]は最大スコアの上側のハンド部を取る得ることができる[L、R]を表します。
1つ の#defineバグ(X)COUT <<#X << "で" << X << ENDL 2 の#define IOのstd :: IOS :: sync_with_stdio(0) 3の#include <ビット/ STDC ++。H> 4 の#define ITER ::イテレータ 5 の#define PA対<整数、整数> 6 の#define PP対<整数、PA> 7 使って 名前空間 STDを、 8 の#define LL長い長い 9 の#define MK make_pair 10 の#define PB一back 11 の#define SE第 12 の#define Fiの第 13 の#define LS 1 << O 14個 の#define O RS << 1 | 1 15 CONST LL MOD = 1E9 + 7 。 16 のconst int型 N = 1E3 + 10 。 17 18 のint A [N]、B [N]。 19 INT D [N]、[N]。 20 21 INT N。 22の 23 INTの DFS(int型 L、INT R){ 24 であれば(L == R)を返す[L]を、 25 26 であれば(D [L] [R])戻りD [L] [R]。 27 28 INT ANS = - 1E9; 29 30の ANS = MAX(ANS、B [R] -b [1- 1 ] -dfs(L + 1 、R)); 31 ANS = MAX(ANS、B [R] -b [1- 1 ] -dfs(L、R- 1 ))。 32 リターン D [L] [R] = ANS。 33 } 34 、INT (){主 35 36 のscanf(" %d個"、&N) 37 のために(INT iは= 1 ; iが<= N; I ++ ){ 38 のscanf(" %dの"、および[I])。 39 B [I] = B [I- 1 ] +[I]。 40 } 41 のprintf(" %dの\ n "、DFS(1 、N))。 42 43 }
またはd [i]は[J] iは左端の点で表され、jは上部手が最大のスコアを取る得ることができるセクションをセクションの長さです。
1つ の#defineバグ(X)COUT <<#X << "で" << X << ENDL 2 の#define IOのstd :: IOS :: sync_with_stdio(0) 3の#include <ビット/ STDC ++。H> 4 の#define ITER ::イテレータ 5 の#define PA対<整数、整数> 6 の#define PP対<整数、PA> 7 使って 名前空間 STDを、 8 の#define LL長い長い 9 の#define MK make_pair 10 の#define PB一back 11 の#define SE第 12 の#define Fiの第 13 の#define LS 1 << O 14個 の#define O RS << 1 | 1 15 CONST LL MOD = 1E9 + 7 。 16 のconst int型 N = 1E3 + 10 。 17 18 INT N。 19 のint A [N]、B [N]。 20 INT D [N]、[N]。 21 INT メイン(){ 22 のscanf(" %d個"、&N) 23 のために(INT iは= 1 ; iが<= N; I ++ ){ 24 のscanf(" %dの"、および[I])。 25 B [I] = B [I- 1 ] + [I]。 26 D [i]を[ 1 ] = [I]。 27 } 28 のために(INT J = 2、J <= nであり、j ++ ){ 29 のために(INT iは= 1 ; iは<Nを=; I ++ ){ 30 、D [i]が[j]はMAX(B [iが+ jは= - 1 ] -b [I- 1 ] -d [I] [J- 1 ]、B [I + J- 1 ] -b [I- 1 ] -d [I + 1 ] [J- 1 ])。 31 } 32 } 33 printf(" %D \ n "、D [ 1 ] [N])。 34 }