U49214 水の三角:给定层数n,计算定点到右下角的路径方案数
这个是{\rm 4}4阶三角图。。
题目描述
现在我们定义一个三角图是像上面一样的图。。
请求出一个NN阶三角图从最上方的顶点走到右下方的点的方案数。
有TT组询问。
输入输出格式
输入格式:
第一行一个正整数T
第二行T个正整数Ni
输出格式:
T行,共T个正整数,表示答案模998244353的结果。
输入输出样例
输入样例#1:
3
1 2 3
输出样例#1:
1
2
6
赛题分析:
可以考虑先写一个枚举路线的dfs,然后打表OEIS。
动态规划和递推
设n是层数,顶点的坐标为1,1 令f[x][y]是x,y点到右下角的方案 则有:
- 对于已经是最右下方的终点 f[n][n]=1
- 对于第n层(最下一层) f[n][y]=f[n][y-1]=1
- 对于右侧有 f[x][y]=f[x+1][y]+f[x+1][y+1]
- 对于其他位置都有f[x][y]=f[x][y+1]+f[x+1][y]+f[x+1][y+1]
注意取模和自下而上、自右向左打表即可 大概可以过60%的数据,
#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
const int MAXN = 5000;
int f[MAXN + 1][MAXN + 1];
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
for (int y = 1; y <= n; y++)
f[n][y] = 1;
for (int x = n - 1; x >= 1; x--) {
for (int y = x; y >= 1; y--) {
if (x == y)f[x][y] = (f[x + 1][y] + f[x + 1][y + 1]) % MOD;
else f[x][y] = (f[x][y + 1] + f[x + 1][y] + f[x + 1][y + 1]) % MOD;
}
}
cout << f[1][1] << endl;
}
return 0;
}
更大的要用卡特兰数计算
∑
i
=
0
n
−
1
C
a
t
a
l
a
n
(
n
−
i
)
×
C
2
n
−
i
−
1
i
i
=
0
\sum_{i=0}^{n-1} Catalan(n-i) \times C_{2n-i-1}^{i} i=0
∑i=0n−1Catalan(n−i)×C2n−i−1ii=0
然后只需要预处理出卡特兰数和阶乘,然后直接用上面的式子计算就可以了。