分析
DP [i] [j]は、プログラムの第i行j考慮の数を表します。
たびに、私たちは3例を考えてみます。
自分自身の場所
同じライン上の2点
同じ列の2点
コード
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
const int型 MOD = 1E9 + 7 。
#define追加(x、y)は、X =(X + Y)%MOD
INT DP [ 3010 ] [ 3010 ]、N、M。
INT のmain(){
int型I、J、K。
scanf関数(" %d個の%のD "、&N、&M)。
DP [ 0 ] [ 0 ] = 1 。
用(i = 1 ; iが<= N; iは++)DP [I] [ 0 ] = 1 ;
用(i = 1 ; I <= M; iは++)DP [ 0] [I] = 1 。
用(i = 1 ; iが<= N; iは++ )
のために(J = 1 ; J <= Mであり、j ++ ){
追加(DP [I]、[J]、DP [I - 1 ] [J])。
追加(DP [I]、[J]、4LLの * jは*のDP [I- 1 ] [J- 1 ]%のMOD)。
あれば(私は> 1)を追加(DPを[I]、[J]、1LL * jを×(I- 1)%のMOD * DP [I- 2 ] [J- 1 ]%のMOD)。
場合(J> 1)(DP [I]、[J]、1LLの*はJ×(J-追加1)/ 2 MOD%* DPを[I- 1 ] [J-2 ]%のMOD)。
}
COUT << DP [n]は[M] - 1 << " の\ n " 。
リターン 0 ;
}