説明
整数のシーケンスが与えられると、各操作が+1または-1の値の一個の要素であってもよいし、シーク動作の最小数が原因となり、製品の配列は、各要素が1に等しい必要
溶液
DP
1に等しい数の製品のいくつかは、特定の配列のみが1または-1を含む説明、及び-1発生偶数でなければなりません
我々は$ [i]は[1/0] $ $ I $フロントの数を表すfを定義し、次に、奇数/偶数最小オペランドの合計数-1
だから我々は、移転を検討します
-1回の数は、我々は、私パリティへの段階からの移行I-1変わらず、現在の数が1になってみましょう場合
同様に、-1となり、パリティを変更することを意味
そして、状態遷移方程式は非常に簡単です
コード
#include <ビット/ STDC ++ H> 名前空間SHL { typedefは長い 長いLL。 int型のn、[ 100010 ]。 LLのF [ 100010 ] [ 3 ]。 int型の C [ 100010 ] [ 3 ]。 インラインint型リード(){ int型 RET = 0、OP = 1 。 チャー C = GETCHAR()。 一方、(!{isdigit(c)参照) 場合(C == ' - ')OP = - 1; C = GETCHAR()。 } 一方(isdigit(c)参照){ RET =(RET << 3)+(RET << 1)+ C - ' 0 ' 。 C = GETCHAR()。 } 戻りのRET *のオペアンプ。 } インラインINT AABS(INT X){ リターン X> = 0?X: - X; } 使用STD ::分。 INT (){メイン N = 読み取ります()。 用(登録をint i = 1 [I] = I ++; iが<= n)を読み出します(); 用(登録をint i = 1 ; iが<= N; ++ I){ C [i]が[ 0 ] AABS([I] + = 1)。 // に-1変更 C [I] [ 1 ] = AABS([I] - 1)。 // 1に変更 // はstd :: CERR << C [i]が[0] << "" << C [I] [1] <<はstd :: ENDL。 } F [ 0 ] [ 1 ] = 1LL << 60 。 にとって(登録をint i = 1 ; iが<= N; ++ I){ [I] F [ 0 ] =分(F [I - 1 ] [ 0 ] + C [i]は[ 1 ]、[I F - 1 ] [ 1 ] + C [i]が[ 0 ])。 F [i]を[ 1 ] =分(F [I - 1 ] [ 1 ] + C [i]は[ 1 ]、F [I - 1 ] [ 0 ] + C [i]が[ 0 ])。 } のprintf(" %I64dの\ n "、F [N] [ 0 ])。 リターン 0 ; } }。 INT メイン(){ SHL ::メイン()。 リターン 0 ; }