==二维数组 递推==
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main ()
{
int n,i,j,c = 0;
ll ans[40][40];
while(scanf("%d",&n)==1)
{
if(n==-1) break;
else
for(i = 1;i<=n;i++)
{
ans[i][0] = 1;
for(j = 1;j<i;j++)
{
ans[i][j] = ans[i-1][j]+ans[i][j-1];
}
ans[i][i] = ans[i][i-1];
}
c++;printf("%d %d %lld\n",c,n,2*ans[n][n]);//要考虑对角线上下两部分
}
return 0;
}
```[添加链接描述](%28http://acm.hdu.edu.cn/showproblem.php?pid=2067%29)
==卡特兰数 递推==
```cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[40];
int main ()
{
int n,i,c = 0;a[0] = 1;
while(scanf("%d",&n)==1)
{
if(n==-1) break;
for(i = 1;i<=n;i++)
a[i] = a[i-1]*4 - a[i-1]*6/(i+1);c++;//卡特兰数 递推公式一
printf("%d %d %lld\n",c,n,2*a[n]);
}
return 0;
}
``#include <bits/stdc++.h>
using namespace std;
#define MXN 36
long long c[MXN] = {1,1}; // 卡特兰数表
void init(){ // 打表
for(int i = 2; i < MXN; i++){
for(int j = 0; j < i; j++){
c[i] += c[j]*c[i-j-1];
}
}
}
int main(){
int n, cas = 0;
init();
while(scanf("%d", &n), n != -1){
cout << ++cas << " " << n << " " << 2*c[n] << endl;
}
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交