[ZJOI2008] 生日聚会 - dp
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ZJOI2008] 生日聚会 - dp相关的知识,希望对你有一定的参考价值。
共有(n)个男孩与(m)个女孩打算坐成一排。对于任意连续的一段,男孩与女孩的数目之差不超过 (k)。求方案数。
(n,m leq 150, k leq 20)
Solution
设 (f[i][j][k][l]) 表示放了 (i,j) 个男女,所有后缀中,男生减女生最大为 (k),女生减男生最大为 (l) 的方案数
采用“主动转移”
f[i+1][j][k+1][max(l-1,0)]+=f[i][j][k][l]
f[i][j+1][max(k-1,0)][l+1]+=f[i][j][k][l]
#include <bits/stdc++.h>
using namespace std;
int f[155][155][22][22],n,m,lim;
const int mod = 12345678;
signed main() {
cin>>n>>m>>lim;
f[0][0][0][0]=1;
for(int i=0;i<=n;i++) {
for(int j=0;j<=m;j++) {
for(int k=0;k<=lim;k++) {
for(int l=0;l<=lim;l++) {
(f[i+1][j][k+1][max(l-1,0)]+=f[i][j][k][l])%=mod;
(f[i][j+1][max(k-1,0)][l+1]+=f[i][j][k][l])%=mod;
}
}
}
}
int ans=0;
for(int i=0;i<=lim;i++) {
for(int j=0;j<=lim;j++) {
(ans+=f[n][m][i][j])%=mod;
}
}
cout<<ans;
}
以上是关于[ZJOI2008] 生日聚会 - dp的主要内容,如果未能解决你的问题,请参考以下文章