同時に約4次元のDP二行

今日は本当にあまりにもこんにゃくアップ......自分自身に、このような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]。 

 

分析のための特定のトピックを代入します。

テイクいくつかの例の四角P1004

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 ; 
}
 

 

 

 

 

おすすめ

転載: www.cnblogs.com/ninecities/p/11402082.html