一个简单的动态规划题目,其实就是求一个卡特兰数。思路是这样:把所有的点分成两部分,都是2的倍数,然后各自组合成合乎要求的弦即可。而合乎要求的弦,则是与其他弦不相交的弦,总共有k+1个,k为输入。
难度等级:★☆☆☆☆
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<time.h>
using namespace std;
const int M=1000030;
const int N=1001;
const int inf=1<<29;
//const double inf=1000000000000000000LL;
const double eps=1e-12;
const double pi=acos(-1.0);
int k;
__int64 ans[N][2];
void init()
{
ans[0][0]=1;
ans[1][0]=1;
ans[1][1]=2;
ans[2][0]=2;
ans[2][1]=3;
for(int i=3;i<=30;i++)
{
ans[i][1]=i+1;
for(int j=0;j<i;j++) ans[i][0]+=ans[j][0]*ans[i-j-1][0];
}
}
int main()
{
init();
// for(int i=1;i<=30;i++)
// printf("%I64d %I64d\n",ans[i][0],ans[i][1]);
while(scanf("%d",&k)==1)
{
printf("%I64d %I64d\n",ans[k][0],ans[k][1]);
}
return 0;
}