题目传送门
题目大意:
n男m女围成一个圈,试求满足对于任意连续的一段,男女之差不超过k的方案数。
思考过程&具体做法:
这应该是个比较明显的DP题,那么我们来考虑状态该如何定义:
首先我们可以发现,男女的人数和总人数是可以相互推导的,所以男女及总人数这三个状态我们用二维就能表示
然后我们看到题目让我们求的是任意一段男女之差不超过k的,我们不妨枚举男比女最多多多少和女比男最多多多少,这又是二维的状态
这样我们就可以四维转移DP了
代码:
#include <bits/stdc++.h>
using namespace std;
const int mod=12345678;
int dp[400][200][22][22];
int n,m,k,ans;
int main()
{
scanf("%d%d%d",&n,&m,&k);
dp[0][0][0][0]=1;
for(int i=0;i<=n+m-1;i++)
for(int j=0;j<=n;j++)
for(int x=0;x<=k;x++)
for(int y=0;y<=k;y++)
{
if(dp[i][j][x][y])
{
if(j+1<=n&&x+1<=k) dp[i+1][j+1][x+1][max(y-1,0)]=(dp[i+1][j+1][x+1][max(y-1,0)]+dp[i][j][x][y])%mod;
if(i-j+1<=m&&y+1<=k) dp[i+1][j][max(x-1,0)][y+1]=(dp[i+1][j][max(x-1,0)][y+1]+dp[i][j][x][y])%mod;
}
}
for(int i=0;i<=k;i++)
for(int j=0;j<=k;j++)
ans=(ans+dp[n+m][n][i][j])%mod;
printf("%d\n",ans);
return 0;
}