SGU130,用k条弦将一个圆分成k+1份的方法数。
#include <iostream> #include <vector> #include <string> #include <queue> #include <map> #include <string.h> using namespace std; long long dp[35]; long long f(int k) { if (dp[k]) { return dp[k]; } if (k <= 1) { return 1; } long long ans = 0; for (int i = 0; i < k; i++) { ans += f(i) * f(k - 1 - i); } return dp[k] = ans; } int main() { int k; scanf("%d", &k); memset(dp, 0, sizeof(dp)); printf("%lld %d\n", f(k), k + 1); }