不平等の四辺形ダイナミックプログラミングの最適化

四辺形の不平等

提供機能\(W(x、y)は 、\) で定義されている\(Z \) 上の機能があれば用\(A、B、C、Z \でD \) \(\の当量Bが\ CのLeq \のLeq D \)である(W(A、D)+ W(B、C)\ GE W(A、C)+ W(B、D)\)\、呼び出された関数\(W \ )満たすために四角形不平等を

当然の結果:

提供機能\(W(x、y)は 、\) で定義されている\(Z \)いずれかの場合、上の関数\(A、Z \におけるB \) \(A <B \)である\ (W(A、Bが+ 1)+ W(A + 1、B)\ GE W(A、B)+ W(A + 1、B用+ 1)\)関数\(W \)を満たす四角形不等式

証明:

ため\(A <C \)がある:
\ [W(A、C + 1)+ W(A + 1、C。)\ GE W(A、C)+ W(A + 1、C + 1)\ ]
のための\(A + 1 <C \。)がある:
\ [W(。。A + 1、C + 1)+ W(A + 2、C)\ GE W(A + 1、C)+ W(A + 2、C + 1)\]
二つの式を得るために添加される:
\ [W(A、C + 1)+ W(+ 1 A、C)+ W(A + 1、C + 1)+ W(A +。。。 2、C)\ GE(W
、C)+ W(A + 1、C + 1)\\ + W(A + 1、C)+ W(A + 2、C + 1)\] の順序でした:
\ [(C + W
\(A + 2、C)\ GE W(C)+ W(A + 2、C + 1)W + 1)] というように、任意のための\(\ BのLeq \のLeq C \)がある:
\ [W(A、C + 1)+ W(B、C)\ GE W(A、C)+ W(B、C + 1)\。]
(すなわち、ここで\(B \)の代わりに、\(A + 2 \)ので、\(1 + A <C \) そう\(B \のLeq C \)

同様に、いずれかの\(A \ BのLeq \のLeq C \のLeq D \)がある:
\ [W(A、D)+ W(B、C)\ GE W(A、C)+ W(B、 D)\]

定理1

いずれかのための\(Z \でA、B、C、D \) 関数場合\(W \)は四辺形不等式を満たし、そして\(W(A、D)\ GE W(B、C)\) 次いで、関数\(Fは\)四辺形の不等式を満たす場合\(F \)を満たす:
[F(X、Y)=分(F(X、Z)+ F(Z + 1、Y)+ W(X、Y \ )| X \のLeq Z <Y)\]
特に、私たちは聞かせて\を(F(X、Y)= W(X、Y)= 0 \)

証明:

ときに(X + 1 = Yを\ \ ) 、我々は:
(X + 1、Y)。[F(X、Y + 1)+ F = F(X、X + 2)+ F(X + 1 \ X + 1)= F(X
、X + 2)\] の場合\(F(X、X + 2)\) 最適な決定がされる\(1 + X \) 次いで:
\ [F(X、X +2)F(X、X = W =(X、X + 2)W + + 1)+ F(X + 2、X + 2)(X、X + 1)W +(X、X + 2) \]
明らか
\ [W(X、X +
1)+ W(X、X + 2)\ GE W(X、X + 1)+ W(X + 1、X + 2)\] の場合\(F( X、X + 2)\)最適な決定がされる(Xを\)\、次に:
\ [F(X、X + 2)= F(X、X)+ F(1 + X、X + 2)+ (X、X + 2)Wは
\](X、X + 2)w +(X + 1、X + 2)W = 明らか
[(X + 1、W \ (X、X + W + X + 2) 2)\ GE W(X +
1、X + 2)+ W(X、X + 1)\] と
\ [W(X、X + 1)+ W(X + 1、X + 2)= F( X、X + 1)+ F
(X + 1、X + 2)= F(X、Y)+ F(X + 1、Y + 1)\] したがって、(X + 1 = Yを\ \ ) 、我々が得る:
\ [F(X、Y + 1)+ F \ GE F(X、Y)+ F \(1 + X、Y)(1 + X、+ Y。1。)]
、すなわち不等式四角形ケース。

次に、我々は数学的帰納を使用します

仮定するとき(Y-X <K \)\、四辺形不平等。

私たちは今、考える\(YX = K \)ケースを

オーダー\(F(X、Y + 1)\) する(\)を\が最適な決定であり、\(F(1 + X、Y)\)する(B \)を\最適な決定のため。

想定することができる\(X + 1 \当量A \当量B \)

取得するのは簡単:
(X + 1、Y)\ [F(X、Y + 1)+ F = F(X、A)+ F(。。A + 1、Y + 1)+ W(X、Y + 1。)\ \ + F(X + 1、
B)+ F(B + 1、Y)+ W(X + 1、Y)\] する(F(x、y)を\ \) と\(F(X + 1、 1 + Y-)\)に起因して、\(A \) \ (B \)は必ずしも最適な決定ではないので、我々は:
\ [F(X、Y)+ F(X- + 1、Y + 1)\ルF(X、A)+ F(A + 1、Y)+ W(x、y)は\\ + F(X + 1、B)+ F(B + 1、Y + 1)+ W(X + 1、Y + 1)\]
ので\(W \)はそう、四辺形の不等式を満たす:
\ [W(X、Y + 1)+ W(X + 1、Y)\ GE W(X、Y)+ Wを(。。 X + 1、Y + 1)
\] 誘導仮説、我々は:
\ [F(A + 1、Y + 1)+ F(Bの+ 1、Y)\ GE F(A + 1、Y)+ Fを。。。。 (B + 1、Y + 1
)\] 私たちは持っている:
。\ [F(X、Y + 1)+ F(Xの+ 1、Y)\ GE F(X、Y)+(Xの+ 1、Y + 1)\]

定理2:

いずれかのための\(Z \でA、B、C、D \)関数の場合、\(W \)は、四辺形の不等式を満たす、関数\(F \) を満たす
[F(X、Y)を\ =分(F( X、Z)+ F(Z + 1、Y)+ W(X、Y)|。X \のLeq Zは<Y)が\]
特に、我々はせ\(F(x、y)は (X、Y、W = )= 0 \)

\(P(x、y)は \) オーダーである\(F(X、Y) \) するために最小値をとる(K \)\値。関数場合\(F \)は、四辺形の不等式を満足し、いずれかの\(X \)、\ (Y \) 我々は:
[P(X、Y-1)\のLeq P(X、Y)\のLeq P \ (X + 1、Y)\
] 証明:

注意してください\(P = P(I、J)\)

いずれかのために\(X <K \のLeq P \) 四辺形によって得られた不等式が:
(X + 1、K)\ [F(X、T)+ F \ GE F(X、K)+ F(Xの+ 1。 、t)が\]
得られた移調:
。\] [F(X + 1、K)-f(1 + X、T)\ GE F(X、K)-f(X、T)\
ので\(P \ )最適な決定のために、私たちはしている:
[F(X、K)を+ F(K + 1、Y)\ GEのF(X-、P-)+ F(P- + 1、Y)が\] \
これ:
\ [ \開始{アレイ} {LCR} (F(X + 1、K)+ F(K + 1、Y)+ W(X + 1、Y)) - (F(X + 1、P)+ F(P + 1、y)が(W + X + 1、Y))\\ =(F(X + 1、K)-f(x + 1、P))+(F(K + 1、Y)-f( P + 1、Y))\\ \ GE(F(X、K)-f(X、P))+(F(K + 1、Y)-F(P + 1、Y))\\(= F(X、K)+ F
(K + 1、Y)) - (F(X、P)+ F(P + 1、Y))\\ \ GE 0 \端{アレイ} \] この手段、以下のための\(F(X + 1、 Y)\) 任意決定\(K \のLeq P \)、\ (P \)よりも良好な\(K \) より好ましくは(等しいを含みます)

そう
\ [P(X + 1、
Y)\ GE P(X、Y)\] 同じ理由
\ [P(X、Y-
1)\当量P(X、Y)\] ので
\ [P( X、Y-1)\当量 P(x、y)が\当量P(X + 1、Y))\]

1. [NOI1995]合成砂利

ある\(N- \)スタック石(環状)、のみ、隣接するパイルパイルに組み合わせることができる石各スコアが最大値と最小スコアスコアを求め、両チームの合計であります

明らかに、この質問は間隔dpがあります。

オーダー\(DP [I] [jが 】\) を表し\(Iは\)する(J \)\(同様に最大)の石の間合わせ最小、我々は容易に状態遷移方程式を一覧表示することができています:\
[DP [I] [J] = MAX(DP [I]、[J]、DP [I] [K] + DP [K + 1]〜[J] + D(I、J)|私は\のLeq K。 <J)\]
ここで、\(D(i、j)が \) を表し\(私は\)をする(J \)\石の間の数を

問題は、私たちが四角形の不平等を最適化するために使用できる最小値であるとき。この場合には、\(DP [I] [J] \)、我々は唯一の間隔必要([P [X] [\を Y-1]、P [X + 1] [Y] \) 列挙(\ K \)の時間複雑さである\(O(N ^ 2) \)

(注:最大値は単調ではない、不等式が四角形最適化することができません)

コード:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int dp[maxn][maxn];
int dp2[maxn][maxn];
int n;
int a[maxn];
int sum[maxn];
int p[maxn][maxn];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i+n]=a[i];
    for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i],p[i][i]=i;
    for(int i=n<<1;i>=1;i--)
        for(int j=i+1;j<=n<<1;j++){
            dp[i][j]=0x3f3f3f3f;
            for(int k=p[i][j-1];k<=p[i+1][j];k++){
                if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]<dp[i][j]){
                    dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
                    p[i][j]=k;
                }else if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]==dp[i][j])
                    p[i][j]=max(p[i][j],k);
            }
        }
    for(int len=2;len<=n;len++){  
        for(int i=1;i<=n*2;i++){  
            int j=i+len-1;
            if(j>2*n) break;
            for(int k=i;k<j;k++){  
                dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);    
            }  
        }  
    }  
    int ans=0x3f3f3f3f;
    int ans2=0;
    for(int i=1;i<=n;i++) ans=min(ans,dp[i][i+n-1]);
    for(int i=1;i<=n;i++) ans2=max(ans2,dp2[i][i+n-1]); 
    printf("%d\n%d\n",ans,ans2);
    return 0;
}

おすすめ

転載: www.cnblogs.com/ybwowen/p/11116654.html