- 王の浮き沈み

王はすべての異なる高さのガードを持っています。むしろ高順位を増減でそれらを並べるよりも、彼はそれらをラインアップしたいので、各ガードは、彼の隣に警備員よりも短いか、彼の隣に警備員よりも背が高いのいずれかである(その高さが上がるとダウンラインに沿って) 。例えば、高さ160、162、164、166、168、170および172 cmで7つのガード。配置することができます。 


多分: 


王は彼が、彼は彼の治世の残りのためのガードの各変化でアップ異なるとダウン順序を持つことができる必要がありますどのように多くの警備員知りたいです。これを行うことができるようにするには、彼はそこにあるどのように多くの異なるアップとダウンの受注、警備員の一定数について知る必要があり、nは 

4つのガードがある場合たとえば、:1、2、3,4のように手配することができます: 

1324、2143、3142、2314、3412、4231、4132、2413、3241、1423 

この問題については、あなたが入力として正の整数n、警備員の数を取り、上下の数を返すプログラムを書きます異なる高さのn個のガードの受注。 

入力のInputThe最初の行は、以下のデータセットの数であり、単一の整数P(1 <= P <= 1000)、含まれています。各データセットは2つの整数を含む入力単一の行から成ります。最初の整数は、Dは、データセットの数です。第2の整数、nは(1 <= N <= 20)は、異なる高さのガードの数です。 
各データセットOutputFor出力の一行があります。これは、アップおよびnガードの注文下の数字が続く単一スペースに続くデータセット数(D)を含有します。 
サンプル入力

4 
1 
2 3 
3 4 
4 20

サンプル出力

。1 1 
2 4 
。3 10 
4 740,742,376,475,050。
タイトル効果:に従ったデータの組「低レベルの低レベル..」または「低背ボトム...」配置、レベルを表すデータのサイズ、
アイデア:被験者は非常にまれなああです!N、N(n)がハイであるデータの途中のデータを左過去に途中から読み出される高及び低の低レベルを想定し..... ローレベルから(n)がハイである右側に中央を越え読み取る....したがって、順列の総数は順列の適切な数の左の順列の数で乗算され、我々は、第1の最大数、N-1のその後数を固定しました左の上のnの数jを取り出す
構成に応じがC(N-1、j)の組み合わせである 、DP [j] [0] * DP [N-1-1] [1] * C(N-1、J )前記DP [J] [0] J nは左揃えパーソナルDP [N-1-J]の総数である [1] 右側N整列個々のN-1-jの総数です。その後も、それを増やす,,最後で最高の数の位置を考慮してください。
ACコード:
#include <iostreamの> 
する#include <アルゴリズム>
 使用して 名前空間STD; 
typedefの長い ロングLL; 
LL SUM [ 21である]; 
LL DP [ 21である ] [ 2 ]; 
LL C [ 21である ] [ 21である];
 ボイドcinin(){//この関数は、結合データの配置のために計算されるC(I、J)である
ためint型 I = 0 ;私は= < 21があり、Iは++ ){ C [I] [ 0 ] = C [I] [I] = 1 ; } [C 1 ] [ 1 ] = 1 ; 以下のためにint型 I = 2 ;私は= < 21であり、Iは++ ){ ためINT J = 1。 ; J <I、J ++ ){ C [I] [J] = C [I- 1 ] [J- 1 ] + C [I- 1 ] [J]; } } } ボイドは、(解決){ DP [ 0 ] [ 0 ] = 1 ; // 0 1に去ったとき(下乗算がそうであるように0ではない) DP [ 1 ] [ 0 ] = 1 ; //番号1が残っている DP [ 1 ] [ 1 ] = 1; //同じで右 DP [ 0 ] [ 1 ] = 1。; のためint型 I = 2 ;私は= < 21 ; I ++の)//ここでテーブル、21から20までの合計,,個人で十分に果たしています。 { LL S = 0 ; のためのINT J = 0 ; J <I、J ++ ){//データが最高解除位置とみなすことができる S + DP = [J] [ 0 ] * DP [IJ- 1。 ] [ 1 ] * C [I- 1 ] [J]; } SUM [I] = S; DP [I] [ 0 ] DP = [I] [ 1。] = S / 2 ; iが左側にIおよび合計がSに等しいされる個体の右側に個々の//(私は理解していない、後でバーを補充) } リターン; } int型のmain(){ cinin( ); SUM [ 0 ] = 0 ; SUMの[ 1。 =] 1。; (解決); INT T; CIN >> T; 一方(T-- ){ int型A、B、 CIN >> A >> B; のprintf(" %D%LLD \ N- " 、A、SUM [B]); } 戻り 0 ; }

 

おすすめ

転載: www.cnblogs.com/Accepting/p/11272214.html