1. 程式人生 > >【計蒜客系列】挑戰難題29:奇異家庭

【計蒜客系列】挑戰難題29:奇異家庭

有一種奇怪的大家族,這種家族裡的人要麼沒有孩子,要麼就有兩個孩子。已知某個這種家族共有N個人,家族中共有K代人。你能告訴我這樣的一個家族可能的家譜結構的種數除以9901的餘數是多少嗎?
輸入包括一行,包括兩個被空格分開的整數,第一個為家族中的人數N(3≤N≤200),第二個為家族中的代數K(1 < K < 100)。
輸出僅一行,包含一個整數,表示這樣的一個家族可能的家譜結構的種數除以9901的餘數。
樣例1
輸入:
5 3
輸出:
2

參考資料:

題目分析

#include <iostream>
#include <cstring>
#define N 201
#define MOD 9901
using namespace std;
int dp[N][N], n, k; //
int main() {
	cin>>n>>k;
	memset(dp, 0, sizeof(dp));
	for (int i = 1; i <= k; i++) {
		dp[1][i] = 1;
	}
	for (int i = 2; i <= k; i++) {
		for (int j = 3; j <= n; j += 2) {
			for (int p = 1; p <= j - 2; p += 2) {
				dp[j][i] = (dp[j][i] + dp[p][i - 1] * dp[j - p - 1][i - 1])
						% MOD;
			}
		}
	}
	cout<<(dp[n][k] - dp[n][k - 1] + MOD) % MOD<<endl;
}