题目大意:一个圆上有2K个点,用K个线把他们连接起来,求出这些线最少可以把这个圆分成P部分,有N种分割方法。输出N和P。
分析:分割线一定是相互不相交的线,所以可以把这写分成两部分,f[i] += f[j]*f[i-j-1](j[0....i-1])。
===========================================================================================
#include<stdio.h> #include<math.h> #include<algorithm> #include<iostream> using namespace std; const int MAXN = 31; int main() { long long f[MAXN] = {1, 1, 2}; for(int i=3; i<MAXN; i++) for(int j=0; j<i; j++) { f[i] += f[j] * f[i-j-1]; } int N; scanf("%d", &N); printf("%lld %d\n", f[N], N+1); return 0; }
原文:http://www.cnblogs.com/liuxin13/p/4839365.html