【解题思路】

  DP。f[i][j][x][y]表示已选了i个♂和j个♀,其中♂比♀多x,♀比♂多y(x,y≥0)。

  递推式转移方程:

(f[i+1][j][x+1][max(y-1,0)]+=f[i][j][x][y]);
(f[i][j+1][max(x-1,0)][y+1]+=f[i][j][x][y]);
  复杂度O(nmk2)。
【参考代码】
 1 #include <algorithm>
 2 #include <cstdio>
 3 #define REP(i,low,high) for(register int i=(low);i<=(high);++i)
 4 #define AwD 12345678
 5 using namespace std;
 6 static int n,m,k; int f[155][155][25][25]={0};
 7 int main()
 8 {
 9     scanf("%d%d%d",&n,&m,&k),f[0][0][0][0]=1;
10     REP(i,0,n) REP(j,0,m) REP(i1,0,k) REP(j1,0,k)
11     {
12         if(i<n) (f[i+1][j][i1+1][max(j1-1,0)]+=f[i][j][i1][j1])%=AwD;
13         if(j<m) (f[i][j+1][max(i1-1,0)][j1+1]+=f[i][j][i1][j1])%=AwD;
14     }
15     int ans=0; REP(i,0,k) REP(j,0,k) (ans+=f[n][m][i][j])%=AwD;
16     return printf("%d\n",ans),0;
17 }
View Code