私はちょっとDIV3で行う、次のDP慣行が右感じることはありませんだと思います
最小化戦略:背面に移動皆の存在の前に入れていない、それが前に前に移動しました
現在の位置を考慮して、その後、それはフロントへの移行が付いていない、次の位置:最大値の戦略を選択します
/ * DP [I] [0]表示向前移动了、DP [I] [1]表示不动、DP [I] [2]表示后移 * / の#include <ビット/ STDC ++。H> 使用して 名前空間STD ; #define N 200005 INT N、[N]、CNT [N]、[N]は、 int型のmain(){ CINを >> N。 以下のために(INT iが= 1 ; I <= N; I ++)CIN >> [i]は、CNT [I]] ++ ; 以下のために(INT iが= 1 ; I <= N; I ++)場合(CNT [I]){ 場合(有する[I])を続けます。 もし(有する[I- 1 ])続けます。 場合(![1-有する1 ]) 有する[I + 1 ] = 1 。 } INT TOT = 0 。 以下のために(INT iが= 0 ; I <= N + 1 ; I ++)TOT + = 有する[I]。 coutの << TOT << " " ; memsetを(有し、0、はsizeof 有します)。 用(INTは iは= 1 ; <I = N; ++ I)の場合(CNT [I])が{ 場合(!有する[I- 1 ])CNT [I] - 、[1-有する1 ] = 1; もし(CNT [i])とは、{ もし(有する[I])を有する[I + 1 ] = 1。// 移到后面 他{ 有する[I] = 1 。 もし(CNT [I]> 1 ) 有する[I + 1 ] = 1 。 } } } TOT = 0 。 以下のために(INT iが= 0 ; I <= N + 1 ; I ++)TOT + = 有する[I]。 coutの << TOT。 }