インターバル動的計画法上の

\({\書き込む前} \ mathcal \)

研究ノートを書いた印象を、深めるために。

紙と間違っている場合、また、感謝して記入してください。

\(\ mathcal {PS:} \) 著者鶏肉料理の限られたレベル、私は書いていない、qwqああスプレーしません

\(\ mathcal {\対象に\是非} \)

私たちは、最初の質問で始まります。

\(\ mathcal {通報\リンク\:P1090} \)

問題のソリューションです\(N- \)スタックフルーツ任意の最小の物理的なコストに必要な杭の最終値にマージ結合さ2つの山。欲張り法は、最小のコストを合わせた各2つのパイルは、小さなヒープルートを維持することによって達成することができることを考えることは容易です。ここでは、コード内で与えられていない、読者は自分自身を達成します。

あなたが唯一のタイトルに変更してマージすることができた場合に続いて、検討し、隣接する 2つの山(、つまり、ライン内のすべての果物を確保する最初のスタックと\(N \)スタックが隣接していない)、明らかに貪欲その後、アイデアは現実的ではありません。アルゴリズムを変更する必要があります。

\(\ mathcal {解決} \)

当社は、これらの果物ヒープをマージの山にマージすることが最終的にどのように関係なく、そう思うことはできません。

たとえば:5つのスタックは、果実(1-5番)があると仮定し、彼らは最終的に山にマージするときに、それがなされなければならない①マージする必要がある- ②③④⑤|①② - ③④⑤| ①②③ - ④⑤|①②③④ - ⑤ 得られた4つの方法をマージするための合併(\(\) - \(B \)を表す\(\)\(B \)組み合わせを)。

それは、私たちは合併から山の最後の束であるかを知る必要がある、ある、問題が解決されます。2本の杭の合併から、ある最適に必要な最終的な解決策は、全く後遺症が存在しない、最適なダイナミックプログラミングの基礎構造と、2つの山の合併状況の性質に沿ってのみ依存しない、最適である必要があります、したがって、我々はこの問題を解決するための動的プログラミングの使用を考慮することができます。

規則:\ (H(A、B)\)の数を表し、\(\)する(B \)を\全てのスタックが得られたマージスタック

説明ステータス

オーダー\(DP [I] [jは ] \) の数を表す\(私は\)する(J \)\全果実スタックは、最小の物理消費値(すなわち、取得するために結合される\(H(i、j)を\)最小値)。以降\(H(i、j)は \) によって\(H(I、K) \) と\(H(K + 1、 j)を\) を合わせ、すなわち例えば上記
\(H(1、 5)=分\開始{ケース } H(1,1)+ H(2,5)\\ H(1,2)+ H(3,5)\\ H(1,3)+ H(4 5)\\ H(1,4)+ H(5,5)\端{ケース} \)

したがって、我々は得ることができ、状態遷移方程式を

\(DP [I] [J] =分\ {\ DP [I] [K] + DP [K + 1] [J] \ \} +コスト(I、J)\) \(\ \ \ \ \ \)(1 \当量iは\当量K \当量J-1、J当量の\の当量nを\します)

だから我々は、列挙するために行ってきました\(I、J、Kの\ ) 最終的な解決策がある、のようなです\(DP [1] [N-] \) それは次のとおりです。

初始化 dp[i][i]=0;

for(int i=1;i<=N;++i)
  for(int j=i;j<=N;++j){
    for(int k=i;k<=j-1;++k)
      dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+cost(i,j));
    /* dp[i][j]+=cost(i,j);  状态转移方程中的 +cost(...) 操作也可以放到循环外面来做,对于此题没有影响 
       cost可以是一个计算花费的函数,也可以是一个数组,具体看题目而定,而在本题中表示 H(i,j) 的值,可以使用
       前缀和,即将函数cost(i,j)用来计算sum[j]-sum[i-1] 
    */
}

Res=dp[1][N];
    

典型的には(DP \)\第一段階のは、第二次元は状態次元アレイです。あなたは、動的プログラミングの概念は非常に明確であるならありますので、しかし、あなたは、そうすることが実際に問題があることがわかります\を(私は\) ステージとしてではなく

または動的プログラミングの次善の構造特性のために、前の例を取る、我々はやる尋ねる\(DP [1] [5 ] \) 、彼女のサブ問題\(DP [1] [1 ]、\ \(DP [1] [2] \) \(... \) \(DP [4] [5] \)識別し、最高ですが、我々は見ている循環に書いされている必要があり、行う\(DP [1]〜[5 ] \) 、使用する必要\(DP [2] [する。3] \) \(DP [2] [4] ... \) \(DPの[4を] [5] \) 全てが決定されていません。

上記の状態遷移方程式の可変範囲について、考えることができる\(\ 1 \は、当量iが\
当量j個の\の当量のn個の\ \ I \当量K \当量J-1 \ \ \\) 明らかに、結合転写を式図、\(DP [K + 1] [J] \)配列の相\(K + 1 \)はより大きくなる\(Iは\)この段階で、即ちステージ\(Iは\)すべてまだ決定されて良い状態は、背後待つ段階を決定するために使用される\(K + 1 \)は明らかに間違っている状態です。

ここでは、どのようなステージへと最終的に検討していきます。

我々は、見つかった\(H(1,5)が\) 彼女は得られた合成5のスタックであり、彼女の部分問題\(H(1,2)、\) \(H(2,4) \) 等、すなわち、2で得られた4に合わせたスタックによって決定されることに属している(N \)\によって形成された合成スタック\(H(+ N-1)\) 、我々 2を実行する必要性によって決定される\(N-1 \)番目スタック合併\(H(-K + 1)\) 以来\(k個\)がより小さくなければならない\(\ N-)ので、私たちはすることができますいくつかのヒープをマージステージとして。ノウハウ見つけ組み合わせたスタック数は、単にスタックが終了位置を計算することができ、組み合わせ操作のスタックの初期位置を知っています。

次の擬似コードは、正しいを与えます

初始化 dp[i][i]=0; 

for(int L=2;L<=N;++L) //这里合并的堆数从2开始,也就是最少两个堆合并
  for(int i=1;i+L-1<=N;++i){  //枚举起点
    int j=i+L-1;  //由起点计算出终点
    for(int k=i;k<=j-1;++k)
      dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+cost(i,j));
}

Res=dp[1][N];

これまでのところ、問題が解決されました。

\(終わり\)

上記のコードの範囲は、動的プログラミングに基づいて考え、それは基本的なルーチンである1列挙インターバル長 列挙は、始点、終点を算出する 列挙転移点 4の転送状態を

しかし、今過半数当然の疑問は、彼らは、いくつかの州では、遷移状態を説明しますので、あなたはあまりにも裸のモデルを与えるか、または実行しないであろう\(DP \)大騒ぎする前に、治療の側面を。前記環状領域最も動的調整クラシック、分析のための一例として、この紙。

私たちは、再び前のトピックを変更することができます\(N \)パイルフルーツのサークルだけマージすることができ、に隣接した少なくとも物理的なコスト値を尋ね、他の合意の元のタイトルと一致し、山を。

\(\ mathcal {解決} \)

私たちは、マップを見て

図から分かるように、リングから取られた長さと実際換算で溶液の環状分布(\ N-)\鎖、我々はソリューションを行うフロントトピック\(DP [1]〜[N ] \) が、このリングチェーンを取ら例1。

よりシンプルなアプローチは、サイクルのオリジナルサイクル最外層であり、その後、出発点の列挙チェーンを設定し、また、自分でしようとする読者を招待。これは、規制の環状のダイナミックレンジの古典的な溶液を導入します。

切断リング

それはリングであるので、当然、我々はそれがチェーンになるように、リングにナイフを「カット」を検討することができます。:説明のためにリングを解決する可動規制より一般的に使用される方法であるこのような連鎖移動リング、リングセグメントは、我々は表現することができる123451234、すなわち、長さ\(N- \)ループ長となりますされる(2N-1 \)\チェーンを。その後で最適解12345 23451 34512 45123 51234真ん中。

あなたは、次の操作がわかりますし、前の文言とまったく同じになります

擬似コード

初始化 dp[i][i]=0;

for(int i=1;i<=N;++i) a[i]=a[i+N]=read();  由环转链 

for(int L=2;L<=N;++L)
  for(int i=1;i+L-1<=2*N-1;++i){
    int j=i+L-1;
    for(int k=i;k<=j-1;++k)
      dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+cost(...));
}

Res=min{dp[i][i+N-1]}  1<=i<=N

理解了之后,就可以尝试做这两道环形区间动规的经典题目。(如果还有例题可以提出来哦)

\(\mathcal{Problem\ Link : P1880}\)

\(\mathcal{Problem\ Link : P1063}\)

\(end\)

\(\mathcal{After\ Writing}\)

最后,如果你认真看了这篇文章,或多或少一定会有点收获吧(dalao请忽略qwq)。如果你还有什么问题请发在讨论区或者私信我,我会不定时解疑的。

另外笔者文化课水平欠佳,有些抽象的意思实在不能解释的很清楚,还请你们自行画图列表帮助理解哦。

\({End}\)

おすすめ

転載: www.cnblogs.com/SuYii/p/10988769.html