【JZOJ A组】【NOIP2019模拟】给(ca)

Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

3 5

Sample Output

1
1
2
4
8

Data Constraint

在这里插入图片描述

思路

设f[i][j]为有i个叶子结点,向左-向右的边=j的方案数

根据题意,我们要求f[i][0]

考虑如何拓展叶子结点(先向左再向右)

首先考虑向左,由于我们的顺序是先向左再向右,所以我们向左拓展时一定在叶子节点上,所以叶子结点会增加。而且由于向右的不能超过m-1,所以当j<m-1时才能拓展

即f[i][j+1]+=f[i][j]

然后考虑向右,由于我们的顺序是先向左再向右,所以我们向左拓展时一定在叶子节点上,所以叶子结点会增加。而且还是因为先向左再向右,所以j要>0 才能拓展

即f[i+1][j-1]+=f[i][j]

代码

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,N=5077;
int n,m,f[N][N];
int main()
{
	freopen("ca.in","r",stdin); freopen("ca.out","w",stdout);
	scanf("%d%d",&m,&n);
	f[1][0]=1;
	for(int i=1; i<=n; i++) for(int j=0; j<=m; j++)
	{
		if(j<m-1) f[i][j+1]=(f[i][j+1]+f[i][j])%mod;
		if(j>0) f[i+1][j-1]=(f[i+1][j-1]+f[i][j])%mod;
	}
	for(int i=1; i<=n; i++) printf("%d\n",f[i][0]);
}
发布了703 篇原创文章 · 获赞 392 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Eric1561759334/article/details/100807085