您的位置:首页 > 其它

[DP] ZROI 2017提高1 T2.给 Ca

2017-10-06 16:46 423 查看
DP状态的设计比较巧妙,考虑树按dfs序的顺序生成的过程,设 f[i][j] 表示放了 i 个节点,根到当前节点向左走 j 次,的方案数。

转移就是,再往左放一个,或者回到最近的向左走的节点的父亲,在右儿子位置放。

f[i+1][j+1]←f[i][j], f[i+1][j−1]←f[i][j]

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5005,MOD=998244353;
int n,m,f[2][maxn],ans;
void Addition(int &x,int y){ if((x+=y)>MOD) x-=MOD; }
int main(){
freopen("ca.in","r",stdin);
freopen("ca.out","w",stdout);
scanf("%d%d",&m,&n); m--;
f[1][0]=1;
for(int i=1;i<=2*n-1;i++){
if(i&1) printf("%d\n",f[i&1][0]);
memset(f[(i&1)^1],0,sizeof(f[(i&1)^1]));
for(int j=0;j<=m;j++){
Addition(f[(i&1)^1][j+1],f[i&1][j]);
if(j) Addition(f[(i&1)^1][j-1],f[i&1][j]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: