#2754。カウント(回数)

タイトル説明

`のn + e`情報は、小さな葉が受信されている、あなたの  ハックハックに失敗しました!
このメッセージは、このです:
へ`N- + E「:
私の机の仕上げは忘れて、私は助けを求め、健康をチェックすることを聞きました。

葉は
、デスクトップ上の小さな葉を持つ  N- N-これは、本の高さと同じではありません`のn + e`今、あるために、これらの優れた書籍を配置する必要があります。第一と仮定  I I帳の高さ  Hは、[ I ] H [I]、 `性質E「+とN-配置  。1 N-  1、N-整列  P I PIが示さ。
配置された混乱の度合いの定義:  | H [ P- 2 ] - H [ P- 1 ] | + | H [ P- 3 ] - H [ P- 2 ] | + + | H [ P-N- ] - H [ P N - - 1 ] | | H [P2] -H [P1] | + | H [P3] -H [P2] | + ... + | H [PN] -H [-PN 1。 ] |二つの高さの差の絶対値の書籍やそれに隣接しています。
既知の法的要件が置か超えていない彼らの混乱 LL.を
小葉は、 `nは、それが最後にe`をどのように多くの合法的な方法+を置き、知りたいですか?
関与するように NOIの選手NOI、あなたは葉のこの懸念ごく少数、知っておくべき 109+7結果のモジュロ109 + 7。

問題の解決策

置く本を下降すると考えることができる、提供  F [ I ] [ 0 / 1 ] [ 0 / 1 ] [ K ] [ S ] F [I] [0/1] [0/1] [K] [S]これは、フロント後降順を表し  Iまず、Iブック  1位置ブックを入れないで、  N- N位ブックを入れていない、現在存在する  K K孔、及び周囲の露出面と電流以下のため  のSプログラムの個数。ピットは、ここでは、中央の空いている部分を一番右、私たちはユニットとしてこれらのピットの最初のを考慮することができる左端の書籍や書籍を指します。

場合は、書籍の挿入のプロセスを考えてみましょう  Kは> 0:その後、K> 0、
我々はピットを作ることができます。1.に転送、すなわち、  K - 1 K-1;
2.私たちは、その後、ピットの両側に本を補間することができますこれらピットに転送され、変更されないまま  のk K;
3.我々は本ピットの中央に挿入することができ、その後、ピット分割ピット二つのユニット、すなわちへ転送中に  K + 1、K + 1。

最初の場合は  1 / N- 1 / N番目の位置が本を置くことができない、再度上記の点に議論を見てください。

あまり心の状態よりも周方向の長さを考えると、私たちは、限り地平線の上側に、各レコードブック周側として、その後、特定の書籍が地平線に挿入されていると考えることができます。効率:  O N- 2 L O(N2L)。

コード

コードをコピー
#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
CONST int型N = 105、M = 1005 P = 1E9 + 7。
整数N、M、[N]、F [2] [2] [2] [N] [M]、X、Y = 1、S。
INTメイン(){ 
    CIN >> N >> M。
    以下のために(INT I 1 =; I <= N; I ++)
        のscanf( "%dの"、および[I]);ソート(+ 1、+ N + 1)。
    (N == 1)戻りプット( "1")であれば、0。
    F [0] [0] [0] [0] [0] = F [0] [1] [0] [0] [0] = F [0] [0] [1] [0] [0] = 1; 
    用(INT I = N-1; I; I - ){ 
        memsetの(F [Y]、0、はsizeof F [Y])。
        (; L <2 L ++のint L = 0)のための
            ための(INT R = 0; R <2、R ++)
                (K ++; K <= Nのint K = 0)のための
                    (int型V、X、U = 0のための; U <= M; U ++){ 
                        V = U +([I + 1] -a [I])*(K + K +(L!)+(R!))。
                        IF(V> m)でブレーク; X = F [X] [L] [R] [K] [U]。
                            (F [Y] [L] [R] [K] [V] + = 1LL * X *(K + K)%P)%= P。
                            (F [Y] [L] [R] [K-1] [V] + = 1LL * X * K%P)%= P。
                            (F [Y] [L] [R] [K + 1] [V] + = 1LL * X * K%P)%= P。
                        } 
                        もし{(L!)
                            のために(INT J = 0であり、j <2、J ++)
                                (F [Y] [J] [R] [K] [V] + = X)%= P、
                                (F [Y] [J] [R] [K + 1] [V] + = X)%= P。
                        } 
                        もし{(R!)
                            のために(INT J = 0であり、j <2、J ++)
                                (F [Y] [L] [J] [K] [V] + = X)%= P、
                                (F [Y] [L] [j]を[K + 1] [V] + = X)%= P。
                        } 
                    } 
        X ^ = 1; Y ^ = 1; 
                            
    } 
    ため(INT iは= 0; I <= M; I ++)
        (S + = F [X] [1] [1] [0] [I])%= P。
    coutの<< S <<てendl;リターン0; 
}
コードをコピー

おすすめ

転載: www.cnblogs.com/drggvxcvx13/p/12513861.html
おすすめ