且满足DP [A]、[C] + DP [; DP [I] [J] =分(DP [I] [K] + DP [K + 1] [j]はW + [I] [J])如果B] [D] <= DP [A]、[D] + DP [C] [D](<B <= C <D)。
これは、四角形の不等式の性質DPを持っています
[I] [J]不等式単調四辺形の特性を満足Wさらなる証拠が、それはまた、四角形不等式特性DPを有する場合
单调性:W [i]は[J] <= W [i]は[J + 1] <= W [I + 1] [J + 1]
http://www.51nod.com/Challenge/Problem.html#problemId=1022
#include <ビット/ STDC ++ H> の#define第Fiの に#define SE第二 の#define INF 0x3f3f3f3f の#define LNF 0x3f3f3f3f3f3f3f3f の#define cin.tie(0); cout.tie(0)FIO IOS :: sync_with_stdio(偽) #定義 pqueue PRIORITY_QUEUE の#define NEW(B)のmemset(A、B、はsizeof(A)) CONST ダブル PI = 4.0 * ATAN(1.0 )。 constの ダブル E = EXP(1.0 ); const int型 MAXN = 1E6 + 8 。 typedefの長い 長いLL。 typedefの符号なしの長いです 長いULL; // のtypedef対<LL、LL> P。 CONST LLのMOD = 1E9 + 7 。 CONST ULLの基地 = 1E7 + 7 。 使用して 名前空間はstdを、 LL DP [ 2008 ] [ 2008 ]; LL S [ 2008 ] [ 2008 ]; LL [ 2008 ]; INT のmain(){ int型のn; int型のx; scanf関数(" %のD "、&N) 用(int型 iは= 1、I ++; iが<= N。){ scanf関数(" %のLLD "、および[I])。 A [iが N +] = [I]。 } N * = 2 ; 以下のために(int型 i = 1 ; iが<= N; iは++ ){ [I] + = [I- 1 ]。 } のmemset(DP、LNF、はsizeof (DP))。 用(int型 i = 1 ; iが<= N iが++ ){ S [i]は[I] = I。 DP [i]は[I] = 0 ; } のための(INTI = N; I> = 1 ; i-- ){ ための(int型 J = I + 1、J <= nであり、j ++ ){ ための(int型のk = sの[I]、[J- 1 ]; <= SをK [ I + 1 ] [j]は、k個++ ){ 場合(DP [I] [J]> DP [I] [K] + DP [K + 1 ] [J] + [J] -a [I- 1 ]){ DPは、[I] [j]は DPを= [I] [K] + DP [K + 1 ] [J] + [J] -a [I- 1 ]。 S [i]は[J] = K。 } } } } N / = 2; LL ANS = LNF。 以下のために(int型 i = 1 ; iが++; iが<= N {) ANS(ANS、DP [i]は[I + N- =分1 ])。 } のprintf(" %LLDする\ n " 、ANS)。 }