Luogu 1282ドミノ

リンク:https://www.luogu.org/problem/P1282

アイデア:

最小限$ B、口座$ Aに取ると、バックパックの慣行を採用することができます。

ポイント数の上から下へのカードのために、彼らは、行の現在の数を知っていれば、あなたは別のラインを知ることができるように、一定です。

提供$ fは[i] [j]は$ $ I $は$ $ J.に反転するフロント・カード、ポイントの最小数と最初の行を表します

最後に、最初の行に列挙する。

(初期化を除く)元バックパックのすべての状態が最大値を設定することに留意されたいです。

コード:

#include <ビット/ STDC ++ H>
 のconst  int型 INF = 1 << 30 const  int型 MAXN = 1050 ;
使用して 名前空間はstdを、
int型 N、和、RES、ミンクス= INF、ANS = INF、[MAXN]、B [MAXN]、F [MAXN] [MAXN * 6 + 5 ]。
INT メイン(){ 
    CIN >> N。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){ 
        CIN >> [I] >> B [i]は、 + = A [I] + B [i]は、
    } 
    のためにint型 I = 1 ; I <= N。私は++ ){
         ためのint型 J = 0 ; J <= 6 * N; J ++ 
            F [i]は[J] = INF。
    } 
    [F 1 ] [ 1 ] = 0 ; 
    F [ 1 ] [B [ 1 ] = 1 以下のためにint型 I = 2 ; iが<= N; iは++ ){
         ためのint型 J = 0 ; J <= 6 * N; J ++ ){
            もし(J - [I]> = 0 
                F [i]は[J] =(F [I] [J] F [I -分1 ] [J - [I])。
            もし(J - B [i]が> = 0 
                F [i]は[J] =分(F [I] [J]、F [I - 1 ] [J - B [I] + 1 )。
        } 
    } 
    のためにint型 i = 0 ; iが<=和iが++は{)
         であれば(F [N] [I] == INF)を
             続けますint型のres = ABS(I - (合計- I));
        もし(RES < ミンクス){
            ミンクスの =の解像度。
            ANS = F [N] [i]は、
        } 
        であれば(RES == ミンクス)
            ANS = 分(ANS、F [n]は[I])。
    } 
    COUT << ANS << ENDL。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/BeyondLimits/p/11609419.html