目录:
题目:
题意:
给出一个n,求一共有多少中摆法
分析:
摆明的动态规划,至于方程嘛,i代表第几行,j代表第几个,
f[i][j]=f[i−1][j]+f[i][j−1]
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
]
+
f
[
i
]
[
j
−
1
]
,也就是当前的这个的值,等于前面一个和上面一个的和。
当然因为数很大,所以要用到高精加
思路:
1.初始化:
f[i][0]=1
f
[
i
]
[
0
]
=
1
2.根据动态转移方程求
f[i][j]
f
[
i
]
[
j
]
,记得用高精加哟
3.因为是倒序,所以要将
f[n][i]
f
[
n
]
[
i
]
累加求解
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
char f[101][101][61]; short n;
void add(char *a,char *b,char *c){
int g=0;
for (int i=1;i<=60;i++){
a[i]=g+b[i]+c[i];
g=a[i]/10;
a[i]%=10;
}
}
int main()
{
n=read();
for (int i=1;i<=n;i++) f[i][0][1]=1;
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
add(f[i][j],f[i-1][j],f[i][j-1]);
f[n][1][1]--;
for (int i=1;i<=n;i++)
add(f[n][i],f[n][i],f[n][i-1]);
int k=60;
while (!f[n][n][k]) k--;
for (int i=k;i>=1;i--)
putchar(f[n][n][i]+48);
return 0;
}