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