题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1037
dp。f[i][j][k1][k2]表示前i个人中有j个男孩,其中男孩最多比女孩多k1人,女孩最多比男孩多k2人(负数都用0代替)。
用当前状态推下一状态:f[i+1][j+1][k1+1][k2-1]+=f[i][j][k1][k2];f[i+1][j][k1-1][k2+1]+=f[i][j][k1][k2]。
边界f[0][0][0][0]=1。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MaxN=151;
const int MaxK=21;
const int mod=12345678;

int n,m,k,f[2*MaxN][MaxN][MaxK][MaxK];

int main()


{
cin>>n>>m>>k;
memset(f,0,sizeof(f));
f[0][0][0][0]=1;
for (int i=0;i<n+m;i++)
for (int j=0;j<=min(i,n);j++)
for (int k1=0;k1<=min(j,k);k1++)
for (int k2=0;k2<=min(i-j,k);k2++)

{
if (k1<k && j<n) f[i+1][j+1][k1+1][max(k2-1,0)]=(f[i+1][j+1][k1+1][max(k2-1,0)]+f[i][j][k1][k2])%mod;
if (k2<k && (i-j)<m) f[i+1][j][max(k1-1,0)][k2+1]=(f[i+1][j][max(k1-1,0)][k2+1]+f[i][j][k1][k2])%mod;
}
int ans=0;
for (int k1=0;k1<=k;k1++)
for (int k2=0;k2<=k;k2++)

{
ans=(ans+f[n+m][n][k1][k2])%mod;
}
cout<<ans<<endl;
return 0;
}
