1288C二つの配列

質問の意味:

長さ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)。
}

 

おすすめ

転載: www.cnblogs.com/zhanglichen/p/12626445.html