今日は本当にあまりにもこんにゃくアップ......自分自身に、このようなDPの絶対にないアイデアを見つけることはありません。/クライ.JPG
2から選択図でN * N行のグリッドのであれば、[I] [J] [P] [Q] Fアレイ人(i、j)を記録するために行くように、実際には、下左から右に他の男は最適解Jiuhaolaの(P、Q)を歩きました。
進行方向が固定されているので、すなわち、それだけ右または下にあることができ、それは4つだけのケースを有していてもよい:[I-1]〜[J] [P-1] [Q] F、[I-1] F J] [P] [Q-1]、F [i]は[J-1] [P-1] [Q]、F [i]は[J-1] [P] [Q-1]。
状態遷移方程式を得た: F [I] [J] [P] [Q]を= MAX(F [I- 1 ] [J] [P- 1 ] [Q]、MAX(F [I- 1 ] [J] [P] [Q- 1 ]、MAX(F [I]、[J- 1 ] [P- 1 ] [Q]、F [I]、[J- 1 ] [P] [Q- 1 ])))+ D [i]は[J] + D [P] [Q]。
分析のための特定のトピックを代入します。
DP四次元テンプレートのタイトル
番号後ケースの分析は、D [i]は[J]うまくを減算繰り返しながら、実際には、限り、二つの経路として決定され、0からなります。
コード:
書式#include <iostreamの> の#include <cstdioを> 使用して名前空間はstdを、int型のn; int型の D [ 10 ] [ 10 ]、F [ 10 ] [ 10 ] [ 10 ] [ 10 ]。INT メイン() { scanf関数(" %のD "、&N) 一方、(1 ) { int型のX、Y、V。 scanf関数(" %D%D%D "、およびX&Y、およびV)。 もし(x == yの&& Y == V &&のV == 0) 破ります; D [X] [Y]は = Vと、 } のための(int型 i = 1 ; iが<= N ++ I) のために(INT J = 1 ; J <= N; ++ j)の ための(INT P = 1 ++; p <= N P) のための(INT Q = 1 ; Q <= N; ++ Q) { F [I] [J] [P] [q]は [I-F MAX(= 1 ] [J] [P- 1 ] [Q]を、 MAX(F [I- 1 ] [j]を[P] [Q- 1 ]、MAX(F [I] [J- 1 ] [P- 1] [Q]、F [i]は[J- 1 ] [P] [Q- 1 ])))+ D [i]は[J] + D [P] [Q]。 もし [I] [J] [P] [Q] F(I == P && J == Q) - = D [i]は[J]。// 去重 } のprintf(" %d個の\ n " 、F [N] [N] [N] [N])。 リターン 0 ; }
P1006例2のパスのメモ
別のタイトルでは、この質問の2行が重複することもできません。これは、2つの行を重複しません:
次のいずれかで必見です!
列挙されたp I + 1〜mとして限り。
そしてために定義されたPは、私はあまりにも長い間我々の等価出力Fに対する答え[M-1] [nは、Mを列挙しない確かである ] [M] [N-1]( 、実際には、唯一の解決策) (M-1、n)と(N、M-1)が(m、n)は程度のプラスの種類のものを持っていないので。
コード:
書式#include <iostreamの> の#include <cstdioを> 使用して名前空間はstdを、int型M、N。 int型の D [ 55 ] [ 55 ]、F [ 55 ] [ 55 ] [ 55 ] [ 55 ]。INT メイン() { scanf関数(" %dの%のD "、&M、&N) 以下のために(int型 I = 1 ; I <= M; ++ I) のために(int型 J = 1 ; J <= N; ++ j)は scanf関数(" %d個"、& D [i]は[J])。 以下のために(int型 I = 1 ; I <= M; ++ I) のために(int型 J = 1 ; J <= N; ++ j)の ための(INT P = iは+ 1 ; p <= M; ++ P) / / 避免两条线路重合 のための(INT Q = 1 ; nはQ <; ++ Q) F [I] [J] [P] [Q] = MAX(F [I- 1 ] [J] [P- 1 ] [Q]、MAX(F [I- 1 ] [j]を[P] [Q- 1 ]、MAX(F [I] [J- 1 ] [P- 1 ] [Q]、F [i]は[ J- 1 ] [P] [Q- 1 ])))+ D [i]は[J] +D [P] [Q]。 printf(" %d個の\ n "、F [M- 1 ] [n]が[M] [N- 1 ])。 リターン 0 ; }