【解题思路】
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 }
We Secure, We Contain, We Protect.