5488:マージ石II(セクションDP + DP +四角環状不等式最適化)最適化された四辺形不等式砂利合併_C ++ _

四辺形不平等の最適化_砂利合併_C ++

 

  ダイナミックプログラミングでは、しばしば以下の式の状態遷移方程式形態遭遇。

    M(i、j)は=分{M(I、K-1)、M(K、J)}(i、j)はW +(i≤k≤j)(minは最大代わりに使用してもよいです)

  M(i、j)を最適値に間隔[I、J]を表す上記。Wは、(i、j)を支払うために、転送価格のために必要な追加の時間を表しています。この方程式の時間計算量はO(N 3

   

  私たちは、不平等の長方形で、上記の式を最適化しましょう、最初の「単調な区間が含まれている」されているものを導入し、「四角形不平等」

    1であって、単調間隔は:i≤i '<j≤j' の場合は、W(I 'J)≤w(I、J')があり、その後単調Wその間隔が含まれます。(画像は、大セル間の間隔を含むものとして理解することができる場合には、セル間のwの値は、値が大きいほど間隔wを超えません)

    図2に示すように、四角形の不等式:i≤i '<j≤j' のために、 '(i、j)はW +(JをW(I、J)+ W(I ' J')≤wiが')、存在する場合我々は満足した四辺形不平等ワット関数を呼び出します。(大セル間の間隔を超えないwのイメージは、2つの互い違いの間隔として理解することができます)

 

  2つの定理は以下の通りであります:

    1、不平等性を含む満たす単調四角形部W上述した機能は、関数mを満たす不等式プロパティ四角形の場合

       我々は、次に、S(i、j)は、kの最大値はS(I、Jである時wは最適な指標値(即ちi≤k≤jを得るために、M(i、j)に対応する時間を表す定義)= K )。このとき、次の定理があります

    2、M(i、j)は不等式四角形、次いでS(i、j)は単調、即ちS(i、j)は≤s(I、J + 1)≤sを満たす場合(I + 1、J + 1)。

 

  さて、上記有する2つの定理後、我々は満足wの間隔関数は四辺形不等式単調性を含む場合、S(I、J-1)≤s(i、j)は≤s(I + 1があることを見出しました、J)。

  すなわち、元の状態遷移方程式は、次式のように書き換えることができます。

     M(i、j)は=分{M(I、K-1)、M(K、J)} + W(i、j)は(S(I、J-1)≤k≤s(I + 1、 J))(分)を代わりに使用することができる最大

  これは、状態遷移方程式は、間隔の長さL = JIを列挙、およびS(I、J-1)とsの長さであることから(I + 1、j)はL-1であり、以前に計算されており、直接呼び出されます。

  また、最大でn区間の長さは、固定長Lのために、異なる状態は、nを持って、それは時間の複雑で、O(N ^ 2)であり、元の時間複雑度はO(N ^ 3)であります最適を達成するために!

  関数形、およびW満たす方程式は、2つのプロパティの使用を検討する場合にのみ、将来は、四辺形の不等式を最適化します。

 

  以下で使用されるように、状態m(I、J)でDP [I] [j]は上記と同じ意味を表し、留意されたいです。

  一例として、石の合併問題に。

  石は実施例6を重ね、石の各山の数は346542でした

  合わせた隣接石ので、(それぞれが2つの山を合わせた最小を取る)貪欲でない、正規化のみ移動することができます。(注:石のリングは、最後の杭と杭をマージ考慮する必要があります。)

  たとえば、次のように連結砂利スキーム:

    合わせ第346542 - > 7

    > 13 - 第2合流76542

    > 6 - 第三合わせ13542

    > 11 - 第四に1356を組み合わせました

    第五合併1311 - > 24

  合計スコア= 11 + 6 + 7 + 13 + 24 = 61明らかに、スキームを組み合わせる比が導出さ貪欲法(スコア:62)より良いです。

  

  同様の行列が絶えずように掛けダイナミック回帰分析は、再発式を来ります:

    DPを設定する[I] [j]が最適値を組み合わせj番目スタック石にi番目を表し、和[I] [j]はj個の砂利ヒープにi番目の総数を表します。

    (最初の計算を行うことができる[I] [I] [J] =和[J] -sum和[i]は、iは第二のスタックへの第一のスタックの全ての決定された合計数を表しもう一度和を求めて開始します。より高速な計算。)

  そして、状態遷移方程式があります:

      

    私は= kは<<J

  一般的な解決策は、O(N ^ 3)が必要です。次の不等式最適化された四角形を使用してください。

  最初のセクションと四角形単調不等式かどうかを決定します。

     I I 'jはJ'

    3 4 6 5 4 2

  単調性:

    W [iが 'j] = W 4 + 6 + 5 = 15 [I、J'] = 3 + 4 + 6 + 5 + 4 + 2 = 24

  したがって、W [I 'J <= W [I、J']単調

  四辺形の不平等:

    W [I、J] + =(3 + 4 + 6 + 5)+(4 + 6 + 5 + 4 + 2)= 18 + 21 = 39 [iが 'J' を、W

    W [iが 'J] + W [I、J'] =(4 + 6 + 5)+(3 + 4 + 6 + 5 + 4 + 2)= 15 + 24 = 39

    故[I、J] W + W [iが 'J '<= W [iが'、j]は[I、J W +']

  石が不平等の四辺形を使用することによって最適化することができるように組み合わせます。

 

  四角形の不等式を使用して、元の状態遷移漸化式の数は、圧縮(Kの即ち、狭い範囲)を行います。

  そうS [I] [J] =分{K | DP [I] [J] = DP [I] [K-1] + DP [K] [j]はW + [I] [j]は}、すなわち計算しますkの最適値(この場合、最小の最適化を取る)場合DP [I] [J]

  k値はまた、最適な意思決定と呼ばれることもあります。決定S単調、以下のように、したがって、状態遷移式におけるkの範囲を変更することができるので。

    S [I、J-1] <= sで[I、J] <= sで[I + 1、j]

    边界:S [I、I] =私

  [I、J-1]、S [I + 1、j]はDP [I算出されるSので[I、J]ときに最適値を得るために、値m [I、J]、格納され、更新され、したがって、sは] [J-1]、および場合は、DPは、[I + 1] [j]を計算しました。

  従って、S [I] [j]を容易に決定するkの範囲にあること。

 

説明

 

N個の石はリングに置か積ま。ストーンパイルにマージするために持っていることです。引当金は、唯一の石、石の山と合併の価格のためのいくつかの新しいレコードの新しい山に隣接する二つの山を選択することができます。N計算石は、最小コストの束にまとめ重ね。

 

例えば:1 2 3 4、合わせた多くの方法があります

1 2 3 4 => 3 3 4(3)=> 6 4(9)=> 10(19)

1 2 3 4 => 1 5 4(5)=> 1 9(14)=> 10(24)

1 2 3 4 => 1 2 7(7)=> 3 7(10)=> 10(20)

 

ブラケットの総コストを見ることができる、最小コストの第一の方法は、数nは、現在最小の結合コストを計算するために、石のヒープが与えられます。

 

 

エントリー

 

行1:N(2 <= N <= 1000)
の2 - N + 1:スタック石のN個(1 <= A [i]が <= 10000)

 

輸出

 

最低価格の合計出力。

 

サンプル入力

サンプル出力

1つの#include <ビット/ STDC ++ H>
 2  の#defineは長い長いっ
 3が 使用 名前空間STDを、
4  
5  のconst  int型 MAXN = 2E3 + 5 6  CONST LL INF = 0x3f3f3f3f3f3f3f3f 7  INT [ARR 2 * MAXN]。
8  INT N。
9  LL DP [MAXN] [MAXN]、POS [MAXN] [MAXN]。
10  LL和[MAXN]。
11  
12  ボイドのinit(){
 13      のmemset(DP、INF、はsizeof (DP))。
14      のためにint型 I = 1 iが= <; 2 * N; iが++ ){
 15          、DP [i]は[I] = 0 ;
16台の          POS [i]は[I] = I。
17      }
 18  }
 19  
20  INT メイン(){
 21の      IOS :: sync_with_stdio()。
22      CIN >> N。
23      のためには、int型 i = 1 ; iがn = <; iは++)CINを>> ARR [i]は、ARR [N + I] =のARR [I]。
24      のためにint型 i = 1 ; iが= < 2和[I] =和[1-; * N I ++)は1] + [I]をARR。
25      のinit();
26      のためにINT LEN = 1 ; LEN <= N; LEN ++ 27      のためのINT i = 1 ; iがLENを+ <= 2 * N; iが++ ){
 28          のint jは= iが+ LENと、
29          のためのint型 K = POS [i]は[J- 1 ]; kは<= POS [I + 1 ] [j]を、++ k個){
 30              であれば(DP [I] [J]> DP [I] [K] + DP [K + 1 ] [J]){
 31台の                  POS [I] [J] = K。
32                  DP [I] [j]はDP [I] [K] + DPを= [K +1 ] [J]。
33              }
 34          }
 35          DP [I] [J] + =和[J] -sum [I- 1 ]。
36      }
 37      LLミネソタ= INF。
38      のためにint型 i = 1 ; iが<= N; iが++ ){
 39          =分ミネソタ州(ミネソタ州、DP [i]は[Iは、N- + 1 ])。
40      }
 41      COUT <<ミネソタ<< ENDL。
42      リターン 0 ;
43 }
コードの表示

 

  ダイナミックプログラミングでは、しばしば以下の式の状態遷移方程式形態遭遇。

    M(i、j)は=分{M(I、K-1)、M(K、J)}(i、j)はW +(i≤k≤j)(minは最大代わりに使用してもよいです)

  M(i、j)を最適値に間隔[I、J]を表す上記。Wは、(i、j)を支払うために、転送価格のために必要な追加の時間を表しています。この方程式の時間計算量はO(N 3

   

  私たちは、不平等の長方形で、上記の式を最適化しましょう、最初の「単調な区間が含まれている」されているものを導入し、「四角形不平等」

    1であって、単調間隔は:i≤i '<j≤j' の場合は、W(I 'J)≤w(I、J')があり、その後単調Wその間隔が含まれます。(画像は、大セル間の間隔を含むものとして理解することができる場合には、セル間のwの値は、値が大きいほど間隔wを超えません)

    図2に示すように、四角形の不等式:i≤i '<j≤j' のために、 '(i、j)はW +(JをW(I、J)+ W(I ' J')≤wiが')、存在する場合我々は満足した四辺形不平等ワット関数を呼び出します。(大セル間の間隔を超えないwのイメージは、2つの互い違いの間隔として理解することができます)

 

  2つの定理は以下の通りであります:

    1、不平等性を含む満たす単調四角形部W上述した機能は、関数mを満たす不等式プロパティ四角形の場合

       我々は、次に、S(i、j)は、kの最大値はS(I、Jである時wは最適な指標値(即ちi≤k≤jを得るために、M(i、j)に対応する時間を表す定義)= K )。このとき、次の定理があります

    2、M(i、j)は不等式四角形、次いでS(i、j)は単調、即ちS(i、j)は≤s(I、J + 1)≤sを満たす場合(I + 1、J + 1)。

 

  さて、上記有する2つの定理後、我々は満足wの間隔関数は四辺形不等式単調性を含む場合、S(I、J-1)≤s(i、j)は≤s(I + 1があることを見出しました、J)。

  すなわち、元の状態遷移方程式は、次式のように書き換えることができます。

     M(i、j)は=分{M(I、K-1)、M(K、J)} + W(i、j)は(S(I、J-1)≤k≤s(I + 1、 J))(分)を代わりに使用することができる最大

  これは、状態遷移方程式は、間隔の長さL = JIを列挙、およびS(I、J-1)とsの長さであることから(I + 1、j)はL-1であり、以前に計算されており、直接呼び出されます。

  また、最大でn区間の長さは、固定長Lのために、異なる状態は、nを持って、それは時間の複雑で、O(N ^ 2)であり、元の時間複雑度はO(N ^ 3)であります最適を達成するために!

  関数形、およびW満たす方程式は、2つのプロパティの使用を検討する場合にのみ、将来は、四辺形の不等式を最適化します。

 

  以下で使用されるように、状態m(I、J)でDP [I] [j]は上記と同じ意味を表し、留意されたいです。

  一例として、石の合併問題に。

  石は実施例6を重ね、石の各山の数は346542でした

  合わせた隣接石ので、(それぞれが2つの山を合わせた最小を取る)貪欲でない、正規化のみ移動することができます。(注:石のリングは、最後の杭と杭をマージ考慮する必要があります。)

  たとえば、次のように連結砂利スキーム:

    合わせ第346542 - > 7

    > 13 - 第2合流76542

    > 6 - 第三合わせ13542

    > 11 - 第四に1356を組み合わせました

    第五合併1311 - > 24

  合計スコア= 11 + 6 + 7 + 13 + 24 = 61明らかに、スキームを組み合わせる比が導出さ貪欲法(スコア:62)より良いです。

  

  同様の行列が絶えずように掛けダイナミック回帰分析は、再発式を来ります:

    DPを設定する[I] [j]が最適値を組み合わせj番目スタック石にi番目を表し、和[I] [j]はj個の砂利ヒープにi番目の総数を表します。

    (最初の計算を行うことができる[I] [I] [J] =和[J] -sum和[i]は、iは第二のスタックへの第一のスタックの全ての決定された合計数を表しもう一度和を求めて開始します。より高速な計算。)

  そして、状態遷移方程式があります:

      

    私は= kは<<J

  一般的な解決策は、O(N ^ 3)が必要です。次の不等式最適化された四角形を使用してください。

  最初のセクションと四角形単調不等式かどうかを決定します。

     I I 'jはJ'

    3 4 6 5 4 2

  単調性:

    W [iが 'j] = W 4 + 6 + 5 = 15 [I、J'] = 3 + 4 + 6 + 5 + 4 + 2 = 24

  したがって、W [I 'J <= W [I、J']単調

  四辺形の不平等:

    W [I、J] + =(3 + 4 + 6 + 5)+(4 + 6 + 5 + 4 + 2)= 18 + 21 = 39 [iが 'J' を、W

    W [iが 'J] + W [I、J'] =(4 + 6 + 5)+(3 + 4 + 6 + 5 + 4 + 2)= 15 + 24 = 39

    故[I、J] W + W [iが 'J '<= W [iが'、j]は[I、J W +']

  石が不平等の四辺形を使用することによって最適化することができるように組み合わせます。

 

  四角形の不等式を使用して、元の状態遷移漸化式の数は、圧縮(Kの即ち、狭い範囲)を行います。

  そうS [I] [J] =分{K | DP [I] [J] = DP [I] [K-1] + DP [K] [j]はW + [I] [j]は}、すなわち計算しますkの最適値(この場合、最小の最適化を取る)場合DP [I] [J]

  k値はまた、最適な意思決定と呼ばれることもあります。決定S単調、以下のように、したがって、状態遷移式におけるkの範囲を変更することができるので。

    S [I、J-1] <= sで[I、J] <= sで[I + 1、j]

    边界:S [I、I] =私

  [I、J-1]、S [I + 1、j]はDP [I算出されるSので[I、J]ときに最適値を得るために、値m [I、J]、格納され、更新され、したがって、sは] [J-1]、および場合は、DPは、[I + 1] [j]を計算しました。

  従って、S [I] [j]を容易に決定するkの範囲にあること。

 

説明

 

N個の石はリングに置か積ま。ストーンパイルにマージするために持っていることです。引当金は、唯一の石、石の山と合併の価格のためのいくつかの新しいレコードの新しい山に隣接する二つの山を選択することができます。N計算石は、最小コストの束にまとめ重ね。

 

例えば:1 2 3 4、合わせた多くの方法があります

1 2 3 4 => 3 3 4(3)=> 6 4(9)=> 10(19)

1 2 3 4 => 1 5 4(5)=> 1 9(14)=> 10(24)

1 2 3 4 => 1 2 7(7)=> 3 7(10)=> 10(20)

 

ブラケットの総コストを見ることができる、最小コストの第一の方法は、数nは、現在最小の結合コストを計算するために、石のヒープが与えられます。

 

 

エントリー

 

行1:N(2 <= N <= 1000)
の2 - N + 1:スタック石のN個(1 <= A [i]が <= 10000)

 

輸出

 

最低価格の合計出力。

 

サンプル入力

サンプル出力

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 
 5 const int maxn=2e3+5;
 6 const ll INF=0x3f3f3f3f3f3f3f3f;
 7 int arr[2*maxn];
 8 int n;
 9 ll dp[maxn][maxn],pos[maxn][maxn];
10 ll sum[maxn];
11 
12 void init(){
13     memset(dp,INF,sizeof(dp));
14     for(int i=1;i<=2*n;i++){
15         dp[i][i]=0;
16         pos[i][i]=i;
17     }
18 }
19 
20 int main(){
21     ios::sync_with_stdio(false);
22     cin>>n;
23     for(int i=1;i<=n;i++) cin>>arr[i],arr[n+i]=arr[i];
24     for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+arr[i];
25     init();
26     for(int len=1;len<=n;len++)
27     for(int i=1;i+len<=2*n;i++){
28         int j=i+len;
29         for(int k=pos[i][j-1];k<=pos[i+1][j];k++){
30             if(dp[i][j]>dp[i][k]+dp[k+1][j]){
31                 pos[i][j]=k;
32                 dp[i][j]=dp[i][k]+dp[k+1][j];
33             }
34         }
35         dp[i][j]+=sum[j]-sum[i-1];
36     }
37     ll minn=INF;
38     for(int i=1;i<=n;i++){
39         minn=min(minn,dp[i][i+n-1]);
40     }
41     cout << minn << endl;
42     return 0;
43 }
View Code

 

おすすめ

転載: www.cnblogs.com/qq-1585047819/p/11771153.html