party (^o^)/YES!
f[i][j][l][s]]代表i个♀,m个♂,从i+j向前延伸max(♀-♂)=l,max(♂-♀)=s
然后枚举第i+j+1个人是♂是♀就好了
注意l和s都要和0取max…因为(额,很显然不会有负数啊…)
代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=150+5,maxk=20+5;
int n,m,k,p=12345678,f[maxn][maxn][maxk][maxk];//f[i][j][l][s]代表i个♀,m个♂,max(♀-♂)=l,max(♂-♀)=s;
int main(){
scanf("%d%d%d",&n,&m,&k);//n个♂,m个♀
memset(f,0,sizeof(f)),f[0][0][0][0]=1;
for(int i=0;i<=m;i++)
for(int j=0;j<=n;j++)
for(int l=0;l<=k;l++)
for(int s=0;s<=k;s++)
f[i+1][j][l+1][max(s-1,0)]+=f[i][j][l][s],f[i+1][j][l+1][max(s-1,0)]%=p,f[i][j+1][max(l-1,0)][s+1]+=f[i][j][l][s],f[i][j+1][max(l-1,0)][s+1]%=p;
int ans=0;
for(int l=0;l<=k;l++)
for(int s=0;s<=k;s++)
ans=(ans+f[m][n][l][s])%p;//记得是+=不是max
cout<<ans<<endl;
return 0;
}
by >o< neighthorn
愿四位学长一切顺利O(∩_∩)O~~