数据范围很小,可以用4维存储下前i个男孩j个女孩,从这一位往前的所有点中男-女的差最大为x,女-男为y的方案数
主动递推:
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 ];
最后答案为
(Sigma x Sigma y) F[ n ][ m ][ x ][ y ]
150 * 150 * 20 * 20的状态数,O( 1 )转移
#include <iostream>
#include <cstdio>
#define N 155
#define K 25
#define mod 12345678
using namespace std;
typedef long long LL;
LL F[N][N][K][K];
int n,m,k;
int main()
{
scanf("%d%d%d",&n,&m,&k);
F[0][0][0][0] = 1LL;
for (int i=0;i<=n;i++)
for (int j=0;j<=m;j++)
for (int x=0;x<=k;x++)
for (int y=0;y<=k;y++) {
if (i+1 <= n && x+1 <= k)
F[i+1][j][x+1][ max(y-1,0) ] = (F[i+1][j][x+1][ max(y-1,0) ] + F[i][j][x][y]) % mod;
if (j+1 <= m && y+1 <= k)
F[i][j+1][ max(x-1,0) ][y+1] = (F[i][j+1][ max(x-1,0) ][y+1] + F[i][j][x][y]) % mod;
}
LL ans = 0LL;
for (int x=0;x<=k;x++)
for (int y=0;y<=k;y++)
ans = (ans + F[n][m][x][y]) % mod;
cout << ans << endl;
return 0;
}