[hdu5629]クラークと木

まず、シーケンスはマジックと呼ばれる Purferの配列、彼は木を表すことができ、各ノードは、この場合の程度発生-1(2-N-のこのよう全長

次いで DP と、F [i]は[J] [K]が前面で表されるiは点番目j個の点は、長さを構成するk個Purferの(もちろん、基準を満たすために)配列を、それが$ Fであり、[I] [J ] [k]は= F [I -1] [J] [K] + \和\ limits_ {i = 0} ^ {[I] -1} F [I-1] [J-1] [KL] \ CDOT C(K、L)$ 、同様にバックパックを除去することができる I J およびK 逆に)、その後再帰的であることができます。

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define N 105
 4  の#define MOD十億七
 5  int型、T、N、F [N]、[N] [N]、C [N]、[N]。
6  INT メイン(){
 7      ためint型 i = 0 ; I <= 100 ; iは++)C [i]が[ 0 ] =のC [i]は[I] = 1 8      のためにint型 I = 2 ; iが<= 100 ; I ++ 9          ためINT J = 1; J <I、J ++)C [I] [J] =(C [I- 1 ] [J] + C [I- 1 ] [J- 1 ])%MOD。
10      のscanf(" %dの"、&T)。
11      一方(t-- ){
 12          のscanf(" %d個"、&N)
13          のmemset(F、0はsizeof (F))。
14          F [ 0 ] [ 0 ] = 1 15          のためには、int型、I = 1(scanf関数をiは++; iがn = <)" %のD "、&[I])。
16          のためには、int型 = Iを1 ; iが<N =; I ++ 17              のためのINT J = I; J; j-- 18                  のためのINT K = N 2、K> = 0 ; k-- 19                      のためのint型の L = 0 ; L <[i]は、L ++ 20                          F [J] [K] =(F [J] [K] + 1LL * F [J- 1 ] [KL] * C [K] [ L])%のMOD。
21          のprintf(" %d個" 、N)
22          のためのint型I = 2、iがn <; iは++)のprintf(" %dの"、F [i]は[I- 2 ])。
23          のprintf(" %Dを\ n "、F [n]は[N- 2 ])。
24      }
 25 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11254634.html