【CF1206B】製品イコールものを作ります

説明

整数のシーケンスが与えられると、各操作が+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> = 0X: - 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 ; 
}

 

おすすめ

転載: www.cnblogs.com/shl-blog/p/11391865.html