bzoj1037

时间:2023-03-10 02:01:35
bzoj1037

题解:

定义f[i][j][a][b]表示已经排了i个人

还能拍j个男的(那么就还有m-i+j个是女的)

还能连续拍a个男的,b个女的

我是递推的

考虑后面一个拍男的还是女的

注意要判断边界

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=,K=,M=;
int n,m,k,f[*N][N][K][K];
int main()
{
scanf("%d%d%d",&n,&m,&k);
f[][n-][k-][k]=f[][n][k][k-]=;
for (int i=;i<n+m;i++)
for (int j=;j<=n;j++)
for (int a=;a<=k;a++)
for (int b=;b<=k;b++)
{
if (j!=&&a!=)(f[i+][j-][a-][min(k,b+)]+=f[i][j][a][b])%=M;
if (j!=n+m-i&&b!=)(f[i+][j][min(k,a+)][b-]+=f[i][j][a][b])%=M;
}
int ans=;
for (int a=;a<=k;a++)
for (int b=;b<=k;b++)
(ans+=f[n+m][][a][b])%=M;
printf("%d\n",ans);
return ;
}