リニアDP - cf1012C良いタイトル

Dpは比較的日常的な質問

/ * 
DP [I] [J] [0 | 1]:私の山々は、カバーなしjの家、私の席をカバーする前に|カバー
DP [I] [J] [ 0] =分(DP [I-1 ] [J] [0]、
                 DP [1-I] [J] [1] + MAX(0、A [I] -a [-I 1]を+1しました。)); 
DP [I] [J] [1。 =分(DP [I-2] [-J 1] [0] + MAX(0、A [I-1] -a [I] + +1)、
                 DP [I-2] [-J 1] [ 1] + MAX(0、 [I-1] -min([I-2]、[I])+ 1)); 
冗長状態ので、アレイDP初期化する
* / 
の#include <ビット/ STDC ++ H>
 使用して 名前空間STD; 

の#define MAXN 5005 INT DP [MAXN] [MAXN] [ 2 ]、N-、A [MAXN]; int型のmain(){ 
    CINは >> N-;
     のためのINT I = 1 ; I <= N; I ++)CIN >> A [I]は、
    のmemset(DP、



0x3fをはsizeof DP)。
    DP [ 0 ] [ 0 ] [ 0 ] = DP [ 1 ] [ 1 ] [ 1 ] = DP [ 1 ] [ 0 ] [ 0 ] = 0 
    [ 0 ] = 0x3f3f3f3f 以下のためにint型 I = 2 ; iが<= N; iは++ )は、{ 
        DPは[I]は[ 0 ] [ 0 ] DPを= [I- 1 ] [ 0 ] [ 0 ]。
        以下のためのint型 J = 1; J <=(I + 1)/ 2 ; J ++ ){ 
            DP [I] [J] [ 0 ] =分(DP [I- 1 ] [j] [ 0 ]、
                            DP [I - 1 ] [J] [ 1 ] + MAX(0、[I] -a [I- 1 ] + 1 ))。
            DP [I] [J] [ 1 ] =分(DP [I- 2 ] [J- 1 ] [ 0 ] + MAX(0、[I- 1 ] -a [I] + 1 )、
                            DP [I - 2 ] [J- 1 ] [ 1] + MAX(0、[I- 1 ] -min([I- 2 ]、[I])+ 1 ))。
        } 
    } 
    のためにint型 i = 1 ; iが<=(1 + N)/ 2 ; iは++ 
        COUT <<分(DP [n]は[I] [ 0 ]、DP [n]は[I] [ 1 ])< < ' \ nを' ; 
}

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/10953936.html