NKOJ P3051じょうろ

制限時間:10000のMS   スペースの制限:65536キロバイト
問題の説明

行の非負整数nは、愛の各値は、位置の数を変更することはできません。我々は、すべての数字は時間に正確に等しい必要があります。操作を行ってもよい:任意の長さの間隔で[I、J]は数字1のそれぞれに追加され、i及びjは、任意でもあるが、唯一のように、唯一の開始点として一度いくつかの間隔を必要とします間隔を終了します。すなわち:任意の2つの区間[L1、R1]と[L2、R2]のために、必要:. L1≠L2、R1≠R2および
すべての出力数がHに等しくなるように、どのように多くの異なる方法を尋ねます。 (10 ^ 9 + 7)十億七の回答モジュロ剰余。
二つの方法限り、実施形態の動作の2つの方法の組の間隔を考慮した、間隔の異なるあり得ます。

入力形式

行1:2の整数nは、H(1≤nは、時間≤2000)
次のn行、各行愛(1≤Ai≤2000)を表す整数
データの30%、N、H <= 30
100%のデータ、N、H <= 2000

出力フォーマット

1行目:答えを表す整数

サンプル入力

サンプル1:
3 2
1 1 1
サンプル2:
5 1
1 1 1 1 1

サンプル出力

サンプル1:
4
サンプル2:
1

 

 

 

水撒き
テストサイトでは、動的計画の範囲
ブラケットDPと同様の方法を議論し、iは数値が間隔の開始点として選択された議論を、左、iの値を更新します
DP [I] [k]は、I-論じたk個の数字で、iの左から右の桁の左側にはまだ左部として(使用されていない意味
出発点の数)、プログラム。
2例について説明します。
ケース1:私は他人によって更新(上記数kとiは、必要に応じて起点範囲として、iを更新することができます)。
若[I] + K == H则DP [I] [k]はDPを= [I + 1] [K-1] * K + DP [I + 1] [K]
k個の数字がk回動作することができる起点部として左へ、次にK桁を使用していない残っているので、説明条件[I] + K == hは、iは、各時間は、Iに更新することができ、kが更新されます時間は、ちょうど[I]となり時間を作ることができます。
今私のために、二つの選択肢、使用または不使用のI私はそこにあります。
インターバルの右端としてIを使用している場合、唯一のエンドポイントIからの時間間隔が、前者のみのk番目のいずれかを選択することができる場合
それと一致するので、プログラムのK種類があり、数kは、Iから選択され、I + 1のみ未使用のK-1個の数を残しているため
k個*のDPの総量[I + 1] [K-1]。
ここで私はポイントの範囲として残すことができないことに注意してください、と私は複数回更新される原因になります、高度になります
H + 1
もしそうでない間隔エンドポイントとしてI、プログラムの数は、[I + 1] [k]をDP
ケース2:私は他人を更新するための出発点としての範囲
若[I] + K + 1 = Hの则のDP [I] [k]はDPを= [I + 1] [K] *(K + 1)+ DP [I + 1] [K + 1]
フロント数k iは、左側の出発点として使用されていないので、説明、操作の全ては、[i]を更新することができるH-1
高さは、それから私は、このセクションの左の範囲のための出発点として、更新ドット、同じ時間更新で高い彼自身を所有している必要があり
1度の更新にも時間に達しました。
したがって、次の番号i + 1、点カウント数iについて任意点を残している、K + 1は、任意の間隔左点を行います
群から選択される残りのk個のポイント、状態DPから選択した後、[I + 1] [K]
iは、セクション左点として、プログラムの数はDPない場合[I + 1] [K + 1]
O(n個の時間複雑
2
)、メモリの使用がより便利に検索を実装する場合。
 
 
 
コード;
//
の#include <ビット/ STDC ++ H>
 に#define MOD十億七
 使用 名前空間STDを、
#defineは長い長いっ
LL N、H。
[F LL 4001 ] [ 4001 ]。
LL [ 4002 ]。
LL DFS(LL I、LL K)
{ 
    場合(F [i]が[K])戻り[I] [K] F。
    { 
        場合(I == N + 1 && K> 0 戻り 0 ;
        もし(K + [I] == H)
             { 
                 fは[I]は、[k]は DFSを=(I + 1、K- 1)* K%+ MOD DFS(I + 1、K)%のMOD。
             } 
             もし(K + [I] + 1 == H)
             { 
                 F [i]が[K] = DFS(I + 1、K)*(K + 1)(I +%+ MOD DFS 1、K + 1)%MOD。
             } 
    } 
    戻り [I] [K]%のF MOD。
    
} 
int型のmain()
{ 
    CIN >> N >> H。
    以下のためにint型 i = 1 ; iが<= N; iは++ 
    { 
        CIN >> [I]。
     }
     F [N+ 1 ] [ 0 ] = 1 ; 
    COUT << DFS(10)%MOD。
    
}

 式のうち、タイトルからの質問で、DP深刻な表情!


 

おすすめ

転載: www.cnblogs.com/OIEREDSION/p/11210858.html