質問の意味:
長さMと配列がデクリメントないが、1とNの間の各数値を必要とBの2つの配列が、B列がインクリメントされず、すべての要素のために、(I)<B(I)、聞いてどのように多くのこのような配列AB、剰余の結果1E9 + 7
ソリューション:
Bフリップ配列は、合わせ配列と厳密配列、この問題を減少させ、シーケンスの種類の数を最小化されていない2 * Mの長さです。
DPは二次元アレイを開く、私がjに等しく、デジタルズームにおける最初のプログラムの後のビットの数を表し、状態遷移方程式が導出されます。
DP(I)(J)= DP(I)(J + 1)+ DP(I-1)(J)
時間計算量はO(M * N)
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; typedefの長い ロングLL、 CONST INT MAXN = 1E3 + 100 ; のconst int型 MOD = 1E9 + 7。; LL DP [MAXN << 1。] [MAXN]; // DP [I] [j]は、i番目の位置はプログラムの数に拡大することができる示し、Jに等しい 整数のmain(){ int型N、M; scanfのを(" %D%D "、&N、&M) のための(INT I = 1 ; I < N =; I ++ ) DP [ 1 ] [I] = 1。; 以下のために(INT iが= 2、I <= 2 * M; I ++ ){ ための(int型 J = N; J> = 1 ; j-- ) DP [I] [J] =(DP [I]、[J + 1 ] + DP [I- 1 ] [j])%のMOD。 } LL ANS = 0 。 以下のために(INT iが= 1 ; I <= N; I ++ ) ANS + = DP [ 2 * M] [i]は、ANS%= MOD。 printf(" %のLLD \ n " 、ANS)。 }