BZOJ1037动态规划

数据范围很小,可以用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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值