207 条题解
-
2852741 LV 10 @ 2018-08-16 15:59:57
#include<bits/stdc++.h>
using namespace std;
long long a[50];
int main()
{
long long n;
cin>>n;
a[0]=1;
a[1]=1;
a[2]=2;
a[3]=5;
for(int i=4;i<=n;i++)
for(int j=0;j<=i-1;j++)
a[i]=a[i]+a[j]*a[i-1-j];
cout<<a[n];
return 0;
}
用递推写的,不要在意,已经AC了 -
12022-08-12 20:17:44@
不会用卡特兰数列。。。
如果进栈次数和出栈次数都等于n,整个操作就结束了。如果进栈次数大于出栈次数,说明栈非空,执行出栈。如果进栈次数小于n,执行出栈#include<bits/stdc++.h> using namespace std; int n,ans = 0; void dfs(int jz,int cz) { if(jz == n&&cz == n) { ans++; return; } if(jz < n) dfs(jz + 1, cz); if(cz < jz) dfs(jz,cz + 1); } int main() { scanf("%d",&n); dfs(0,0); printf("%d",ans); return 0; }
-
12022-07-20 13:29:15@
***用折线法,x表示进行第几次操作,y表示进栈元素个数-出栈元素个数,从(1,1)到(2n-1,1),与x轴下方无公共点.
所以将坐标轴向下移一个单位长度,就是从(1,2)到(2n-1,2),与x轴无公共点,直接套公式.
则答案=C(2n-1,n-1)-C(2n-1,n+1).***
代码如下******如果把catalan数放到走地图这种情景下,不妨将出栈入栈看作两种方式:
(假设从左下向右上走)即向右(出栈)或者向上(入栈)走,因为要出栈n次,入栈n次,所以可以看成是从(0,0)到(n,n)点的走法数。
同时由于栈结构要求在出栈之前必须栈中需要有数,故我们走的路线必须不经过形如(x,x-1)的点,即路线一直在y=x-1这条直线的上面。
可以看出,如果我们从(1,-1)点出发必定会经过y=x-1直线才能到达(n,n)点,且这些路线恰巧和从(0,0)点出发但是通过y=x-1直线再到达(n,n)点的路径一一对应(即我们需要剔除的路线)
所以最终从(0,0)出发到达且不接触y=x-1直线的方式有C(2n,n)-C(2n,n-1)种。
#include<cstdio> #define MAX_N 20 #define ll long long using namespace std; int n; ll f[MAX_N][MAX_N]; int main() { scanf("%d",&n); for(int i=0;i<=n;i++) { f[0][i]=1; } for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { if(i==j)f[i][j]=f[i-1][j]; else f[i][j]=f[i][j-1]+f[i-1][j]; } } printf("%lld",f[n][n]); return 0; }
-
12021-09-25 14:59:26@
#include <bits/stdc++.h> using namespace std; int n, f[30]; int main() { scanf("%d", &n); f[0] = 1, f[1] = 1; for(int i=2; i<=n; i++) for(int j=0; j<i; j++) f[i] += f[j] * f[i-j-1]; printf("%d", f[n]); return 0; }
-
12021-08-26 12:15:26@
#include <bits/stdc++.h> using namespace std; int n, f[30]; int main() { scanf("%d", &n); f[0] = 1, f[1] = 1; for(int i=2; i<=n; i++) for(int j=0; j<i; j++) f[i] += f[j] * f[i-j-1]; printf("%d", f[n]); return 0; }
-
12018-10-25 12:18:55@
为什么难度是1
-
12017-09-07 13:05:20@
用折线法,x表示进行第几次操作,y表示进栈元素个数-出栈元素个数,从(1,1)到(2n-1,1),与x轴下方无公共点.
所以将坐标轴向下移一个单位长度,就是从(1,2)到(2n-1,2),与x轴无公共点,直接套公式.
则答案=C(2n-1,n-1)-C(2n-1,n+1).
代码如下:
#include<cstdio> #include<iostream> using namespace std; int n; int c(int n,int m){ long long s=1,d=1; for(int i=n;i>=n-m+1;i--) s*=i; for(int i=m;i;i--) d*=i; return s/d; } int main(){ scanf("%d",&n); printf("%d",c(2*n-1,n-1)-c(2*n-1,n+1)); }
-
02020-04-10 15:22:00@
/* 简单的递推 通过第一个元素的出栈位置划分 dp[n] = dp[0] * dp[n - 1] + dp[1] * dp[n - 2] + ... + dp[n - 2] * dp[1] + dp[n - 1] * dp[0]; */ #include <iostream> #include <algorithm> using namespace std; int n; int dp[20]; int main() { cin >> n; dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) for (int k = 0; k < i; k++) dp[i] += dp[k] * dp[i - k - 1]; cout << dp[n] << endl; return 0; }
-
02019-10-13 14:32:46@
#include<iostream> using namespace std; int f[110],n; int main() { cin>>n; f[1]=1; for(int i=1;i<=n+1;i++) for(int j=1;j<=i;j++) f[j]+=f[j-1]; cout<<f[n]; }
-
02018-01-13 22:01:52@
如果把catalan数放到走地图这种情景下,不妨将出栈入栈看作两种方式:
(假设从左下向右上走)即向右(出栈)或者向上(入栈)走,因为要出栈n次,入栈n次,所以可以看成是从(0,0)到(n,n)点的走法数。
同时由于栈结构要求在出栈之前必须栈中需要有数,故我们走的路线必须不经过形如(x,x-1)的点,即路线一直在y=x-1这条直线的上面。
可以看出,如果我们从(1,-1)点出发必定会经过y=x-1直线才能到达(n,n)点,且这些路线恰巧和从(0,0)点出发但是通过y=x-1直线再到达(n,n)点的路径一一对应(即我们需要剔除的路线)
所以最终从(0,0)出发到达且不接触y=x-1直线的方式有C(2n,n)-C(2n,n-1)种。 -
02017-11-21 19:45:36@
#include <iostream> #include<cstdlib> #include<cstdio> #include<map> #include<vector> #include<cstring> #include<algorithm> #define mod 7654321 #define FOR(i,x,y) for(i=x;i<=y;++i) #define maxa 10000+100 using namespace std; int c(int n,int m){ long long s=1,d=1; for(int i=n;i>=n-m+1;i--) s*=i; for(int i=m;i;i--) d*=i; return s/d; } int main(){ int n; scanf("%d",&n); printf("%d",c(2*n,n)-c(2*n,n-1)); }
-
02013-10-15 21:38:45@
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>using namespace std;
long long gcd(long long a,long long b)
{
if(a%b==0)return b;
return gcd(b,a%b);
}long long C(long long n)
{
long long cnt1=1,cnt2=1;
for(int i=1;i<=n;i++){
cnt2*=i;
cnt1*=i+n;
long long h=gcd(cnt2,cnt1);
if(h!=1){
cnt2/=h;
cnt1/=h;
}
}
return cnt1/cnt2;
}int main()
{
long long n;
cin>>n;
cout<<C(n)/(n+1)<<endl;
return 0;
} -
02013-10-04 20:59:00@
var tab:array[0..20,0..20] of longint;
n,z1,z2:longint;
Function go(s,x:longint):longint;
var tot:longint;
begin
If x>n then begin tab[s,x]:=1; go:=1; exit; end;
If tab[s,x]<>-1 then begin go:=tab[s,x]; exit; end;
tot:=0;
If s>0 then tot:=tot+go(s-1,x);
tot:=tot+go(s+1,x+1);
tab[s,x]:=tot;
go:=tot;
end;begin
readln(n);
fillchar(tab,sizeof(tab),$FF);
writeln(go(0,1));
end. -
02013-09-13 00:25:15@
最懒的办法
#include <iostream>
using namespace std;
int main()
{
char* Catalanwords[]={"1","1","2","5","14","42","132","429","1430","4862","16796","58786","208012","742900","2674440","9694845","35357670","129644790","477638700","1767263190","6564120420","24466267020","91482563640","343059613650"};
int i;
cin>>i;
cout<<Catalanwords[i]<<endl;
return 0;
} -
02013-08-16 13:13:39@
50题纪念
-
02013-07-24 22:03:01@
目测是格路问题,结果等于C(N+N-1,N)-C(N+N-1,N+1)
-
02013-04-04 11:31:21@
深搜2种情况:出(so(i-1,j+1,t));进:(so(i+1,j,t+1));也可以用卡特兰数做
-
02012-11-03 22:23:47@
Catalan数。。。问度受前15项打表即可- -!
其实我们做过一道加强版,1 -
02012-07-29 09:16:35@
const catalan:array[0..23] of string=('1','1','2','5','14','42','132','429','1430','4862','16796','58786','208012','742900','2674440','9694845','35357670','129644790','477638700','1767263190','6564120420','24466267020','91482563640','343059613650');
var n:integer;
begin
readln(n);
writeln(catalan[n]);
end.
这是最坑爹的做法。。楼下的公式我还没学到。。 -
02012-08-02 15:10:23@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms用公式,m:=C(2n{在右下角},n)/(n+1)
点击查看代码