郵便局

郵便局

X軸の数、vは正の整数増分座標与える\(\ {a_iを\}を\)、P点を探し、最短距離と最小点座標ように、\(V用の\のLeq 300、P \ 30のLeq \) 。

ソリューション

(完全に厳格なると読んでいない場合は、正しいことを証明して確保するにはあまりにも複雑であることが証明されたこの質問は、間違っている可能性があることに注意してください、作者に連絡してください)

ステップ1

答えから問題が区間分割モデルである管部の座標は、聞かせて、いくつかの連続する点を見つけなければならない([I] [j]が\ F)\ iがjの座標点を前にフロントまでの最短距離を表しています最小和、\(W [i]は[J] \) i番目のi番目のj番目の点との最短距離の座標ように選択座標のj番目の座標点の座標であります(\(S_I = \ sum_ 1} = {J ^ ia_j \) すなわち、接頭辞と)。

\ [F [I] [J] = \ MIN_ {0 \当量のK <J} \ {F [I-1] [K] + W [K + 1] [J] \} \]

ボーダー:\(F [I] [I] = 0、I = 0,1,2、..、V \)
回答:\(F [P] [V] \)

显然\(W [i]は[J] = \ sum_ {k = I} ^ J | a_k-A_M |(M = FRAC \ {iがjで+} {2})= [(a_j-A_M)+··· +(A_M-A_M)+ ... \)

\(+(A_M-a_iを)] =(a_j + ... + A_ {M + 1}) - (A_M + ... + a_iを)+ [M-I + 1-(JM)] \)

\(A_M =(s_j-S_M) - (S_M-S_ {I-1})+(2M-I-J + 1)A_M = s_j-2s_m + S_ {I-1} +(2M-I-J +午前1時\)

だから我々は、Wメンテナンスを達成した後、時間の複雑さ、に転送することができます(O(PV ^ 2)\ \)

参照コード:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
using namespace std;
int a[350],s[350],mid[350][350],
    dp[35][350];
template<class free>
il free Min(free a,free b);
int main(){
    int v,p;
    scanf("%d%d",&v,&p);
    for(int i(1);i<=v;++i)
        scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
    for(int i(1),j,m;i<=v;++i)
        for(j=i+1;j<=v;++j)
            m=(i+j)/2,mid[i][j]=s[j]
                -s[m]-(s[m]-s[i-1])+a[m]*(2*m-i+1-j);
    memset(dp,1,sizeof(dp)),dp[0][0]=0;
    for(int i(1),j,k;i<=p;++i)
        for(dp[i][0]=0,j=1;j<=v;++j)
            for(k=0;k<j;++k)
                dp[i][j]=Min(dp[i][j],dp[i-1][k]+mid[k+1][j]);
    printf("%d",dp[p][v]);
    return 0;
}
template<class free>
il free Min(free a,free b){
    return a<b?a:b;
}

setp2

あなたが夢を持っている場合しかし、あなたは、スタックとキューNAは、単調ツリー、モノトーンキュー、デュアルスタックのためのバランスを維持しながら、(倍増、分割、圧縮)、バイナリを最適化するために、明らかに、我々はメンテナンス間隔を必要としないではないとしたいですトップ、バイナリ検索、パワーやスロープの迅速な最適化のためには複雑すぎる離散ライン行列式は、四角形の不平等を考慮していないが、四角形に決定的な証明wの不平等を満たします


証明:不等式の四角形のw

証明:

今証明するために、\を(私は、jは<W [ i]は[J + 1] + W [I + 1] [J] \ GEQ W [i]の[j]が+ W [I + 1] [J + 1] \

ことを証明した(その中央値の設定\を(M_1、M_2、M_3、M_4 \)

$ S_ {J + 1} -2s_ {M_1} + S_ {I-1} +(2m_1-IJ)A_ {M_1} + s_j-2s_ {M_2} + S_ {I} +(2m_2-IJ)A_ {M_2 } \ GEQ $
\(s_j-2s_ {m_3} + S_ {I-1} +(2m_3-I-J + 1)A_ {m_3} + S_ {J + 1} -2s_ {m_4} + S_ {I} +(2m_4-IJ-1)A_ {m_4} \)

ことを証明しました

$ -2s_ {M_1} +(2m_1-IJ)A_ {M_1} -2s_ {M_2} +(2m_2-IJ)A_ {M_2} \ GEQ $
\( - 2s_ {m_3} +(2m_3-IJ + 1 )A_ {m_3} -2s_ {m_4} +(2m_4-IJ-1)A_ {m_4} \)

已知\(M_1 = \ FRAC {iが+ J + 1} {2}、M_2 = \ FRAC {iが+ J + 1} {2}、m_3 = \ FRAC {iがjで+} {2}、m_4 = \ FRAC {iが+ J + 2} {2} \)

I. \(i+j\in\)

そこ\(M_2 M_1 = = = M_4 M_3。1 + \) すなわちプルーフ

\( - 2s_ {M_2} +(2m_2-I-J + 1)A_ {M_2} \ GEQ -2s_ {m_3} +(2m_3-I-J + 1)A_ {m_3} \)

\( - 2a_ {M_2} +(2m_2-I-J + 1)A_ {M_2} \ GEQ(2m_3-I-J + 1)A_ {m_3} \)

\((2m_2-IJ-1)A_ {M_2} \ GEQ(2m_3-IJ + 1)A_ {m_3} \)

\((2-(m_3 + 1)-ij-1)A_ {M_2} \ GEQ(2m_3-I-J + 1)A_ {m_3} \)

\((2m_3-I-J + 1)A_ {M_2} \ GEQ(2m_3-I-J + 1)A_ {m_3} \)

\(A_ {M_2} \ GEQ A_ {m_3} \)

増分座標ので、明らかに\(M_2 A_ {}は\ A_ GEQ M_3} {\) その後、証明され

II. $i+j\in $偶

同様に

\(M_1 M_3 = = = M_2 m_4-1 \) つまりカード

\( - 2s_ {M_2} +(2m_2-IJ-1)A_ {M_2} \ GEQ-2s_ {m_4} +(2m_4-IJ-1)A_ {m_4} \)

\((2m_2-IJ-1)A_ {M_2} \ GEQ-2a_ {m_4} +(2m_4-IJ-1)A_ {m_4} \)

\((2m_2-IJ-1)A_ {M_2} \ GEQ(2(M_2 + 1)-ij-3)A_ {m_4} \)

\((2m_2-IJ-1)A_ {M_2} \ GEQ(2m_2-IJ-1)A_ {m_4} \)

\((I + 1-jij)M_2 A_ {} \ GEQ(I-1 + jij)m_4 A_ {} \)

\( - A_ {M_2} \ GEQ -a_ {m_4} \)

\(A_ {M_2} \当量A_ {m_4} \)

明確に確立

決定された不等式四角形の定理によれば、元素の合計にわたって、W満足する不等式を知ること四辺形が容易


このように列挙私は、その後、単調決定ポイントの増加1次元線形再帰的な意思決定の増分定理が知っていることは容易である限り、我々はキューにトリプルを使用して単調に、時間の複雑さの維持\(O(pvlog_2 ^ Vを) \)

参照コード:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
using namespace std;
struct san{
    int l,r,p;
}T[350];
int a[350],s[350],mid[350][350],
    dp[35][350],L,R;
il int dfs(int,int,int);
template<class free>
il free Min(free a,free b);
int main(){
    int v,p;
    scanf("%d%d",&v,&p);
    for(int i(1);i<=v;++i)
        scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
    for(int i(1),j,m;i<=v;++i)
        for(j=i+1;j<=v;++j)
            m=(i+j)/2,mid[i][j]=s[j]
                -s[m]-(s[m]-s[i-1])+a[m]*(2*m-i+1-j);
    memset(dp,1,sizeof(dp)),dp[0][0]=0;
    for(int i(1),j,k;i<=p;++i){
        L=R=1,T[1].l=1,T[1].r=v,T[1].p=0;
        for(dp[i][0]=0,j=1;j<=v;++j){
            dp[i][j]=dp[i-1][T[L].p]+mid[T[L].p+1][j];if(++T[L].l>T[L].r)++L;
            while(L<=R&&dp[i-1][T[R].p]+mid[T[R].p+1][T[R].l]>=
                  dp[i-1][j]+mid[j+1][T[R].l])--R;T[++R].r=v,T[R].p=j;
            if(L<R){T[R].l=dfs(R-1,j,i-1),T[R-1].r=T[R].l-1;if(T[R].l>T[R].r)--R;}
        }
    }
    printf("%d",dp[p][v]);
    return 0;
}
il int dfs(int t,int p,int i){
    int l(T[t].l),mid,r(T[t].r);
    while(l<=r){
        mid=l+r>>1;
        if(dp[i][T[t].p]+::mid[T[t].p+1][mid]<
           dp[i][p]+::mid[p+1][mid])l=mid+1;
        else r=mid-1;
    }return l;
}
template<class free>
il free Min(free a,free b){
    return a<b?a:b;
}

STEP3

彼は、私は、jがあるため、周期間隔と見なすことができることに留意\(私のLeq J \ \)次に、四辺形W満たすので不等式、境界、\(F [i]は[I ] = W [i]は[I] = 0 \) インクリメント含み、W満たします


証明:wはインクリメンタル会うが含まれています

証明:

座標の結果を増加させないよりはまし座標、そして直接矛盾し、増加せず、結果が良くなります座標プログラムの座標を交換するプログラムを追加し、証明加えることを前提としています。


したがって、二次元の再帰的決定理論は、簡単には四辺形F満たして不平等を知って、その後、二次元の再帰決定増分定理を容易に(提供知っている\(P [L] [R ] \) の[L] [R fは\を( ] \)最適識別点の)\ (P [L] [R&LT-1] \のLeq P [L]は[R&LT] \のLeq P [1 + L] [R&LT] \)ので、我々はする最適化することができる\ (O(^ N-2)\)

参照コード:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
using namespace std;
int x[550],s[550],mid[550][550],
    dp[550][550],P[550][550];
template<class free>
il free Min(free,free);
int main(){
    int v,p;scanf("%d%d",&v,&p);
    memset(dp,1,sizeof(dp));
    for(int i(1),j,m;i<=v;++i){
        scanf("%d",&x[i]),s[i]=s[i-1]+x[i];
        for(j=i-1;j;--j)
            m=i+j>>1,mid[j][i]=s[i]-
                s[m]*2+s[j-1]+(2*m-j-i+1)*x[m];
        P[i][i]=i-1,dp[i][i]=0;
    }dp[0][0]=0;
    for(int i,j(1),k;j<=v;++j)
        for(i=j-1;i;--i)
            for(k=P[i][j-1];k<=P[i+1][j];++k)
                if(dp[i][j]>dp[i-1][k]+mid[k+1][j])
                    dp[i][j]=dp[i-1][k]+mid[k+1][j],P[i][j]=k;
    printf("%d",dp[p][v]);
    return 0;
}
template<class free>
il free Min(free a,free b){
    return a<b?a:b;
}

おすすめ

転載: www.cnblogs.com/a1b3c7d9/p/11183639.html