トピックポータル(内部タイトル34)
入力形式
最初の行、正の整数$ n $という。
第二行、$ N $正の整数で$ a_iを$、$ a_iを$等しく確実。
出力フォーマット
ラインはマミヤ卓司が得られたケーキの和の最大整数サイズを表します。
サンプル
サンプル入力1:
5
2 8 1 10 9
出力例1:
18
サンプル入力2:
8
1 10 4 5 6 2 9 3
サンプル出力2:
26
データ範囲とヒント
サンプル1点の説明:
最適解は:$ 2 $ブロックの卓司6月選択、最初の$ 1 $ブロックから選択された雨コウソース; $ 5 $ブロックの卓司6月選定; $ 4 $ブロックの群から選択される雨コウソース; $ 3 $ブロックの卓司6月の選択。
データ範囲:
$ 32 \%の$データについて、$ 1 \ leqslantのn個の\ leqslant 20 $。
$ 64個の\%の$のデータについては、$ 1 \ leqslantのn個の\ leqslant 30 $。
$ \ 100%の$データ、$ 1 \ leqslant N \ leqslantため 2,000,1 \ leqslant a_iを\ leqslant {10} ^ 9 $、 互いに等しく$その$のa_iをを確実にします。
問題の解決策
$ $ DP、定義された$のDPを考慮すると、[I] [J] $間隔はさらに缶を取ったパリティに応じて決定されたケーキの大きさと最大長さに仕上がっ$ [I、J] $を取得表します。
時間の複雑さ:$ \シータ(N ^ 2)$。
希望のポイント:$ $ 100ポイント。
実際のサブ:$ $ 100ポイント。
コードの時間
#include <ビット/ STDC ++ H>
名前空間STDを使用して、
int型のn;
長い長い[2010]。
長い長いDP [2010] [2010]。
長い長いANS;
INT GET(int型X){IF(X> N)のx = N;戻りX;(!x)は、x + = Nであれば}
長い長いDP(int型L、int型のR、int型X)
{
IF(X> = n-1)は0を返します。
IF(!DP [L] [R] = - 1)戻りDP [L] [R]。
DP [L] [R] = 0;
INT LL = L、RR = R。
INT LFT = GET(L-1)、RHT = GET(R + 1)。
IF([LFT]> [RHT])L = LFT。
他のR = RHT。
LFT = GET(L-1)。
RHT = GET(R + 1)。
DP [LL] [RR] = MAX(DP(LFT、R、X + 2)+ [LFT]、DP(L、RHT、X + 2)+ [RHT])。
DP [LL] [RR]を返します。
}
int型のmain()
{
memsetの(DP、-1、はsizeof(DP))。
scanf関数( "%のD"、&N);
(I 1 = int型、iが<= N; iが++)のためのscanf( "%のLLD"、および[I])。
ANS = MAX(ANS、[I] + DP(I、I、1))のために(iは++; = n iは<I = 1 INT)。
printf( "%のLLD"、ANS)。
0を返します。
}
RP ++