zoukankan      html  css  js  c++  java
  • BZOJ.1037.[ZJOI2008]生日聚会Party(DP)

    题目链接

    f[i][j][a][b],表示当前已有i个男生、j个女生,前面这一段(更前面的保证满足)男生至多比女生多a人,女生最多比男生多b人。
    如果当前选择男生,f[i+1][j][a+1][b-1]+=f[i][j][a][b];否则f[i][j+1][a-1][b+1]+=f[i][j][a][b]。注意一下边界。

    //44504kb	156ms
    #include <cstdio>
    #include <algorithm>
    #define mod (12345678)
    #define Mod(x) (x>=mod)&&(x-=mod)
    const int N=152;
    
    int main()
    {
    	static int f[N][N][22][22];
    	int n,m,K; scanf("%d%d%d",&n,&m,&K);
    	f[0][0][0][0]=1;
    	for(int i=0; i<=n; ++i)//要到n。
    		for(int j=0; j<=m; ++j)
    			for(int a=0; a<=K; ++a)
    				for(int v,b=0; b<=K; ++b)
    					if(v=f[i][j][a][b])
    					{
    						int &boy=f[i+1][j][a+1][std::max(0,b-1)], &girl=f[i][j+1][std::max(0,a-1)][b+1];
    						boy+=v, Mod(boy);
    						girl+=v, Mod(girl);
    					}
    	int ans=0;
    	for(int i=0; i<=K; ++i,ans%=mod)
    		for(int j=0; j<=K; ++j) ans+=f[n][m][i][j];
    	printf("%d
    ",ans);
    
    	return 0;
    }
    
  • 相关阅读:
    DS博客作业02--栈和队列
    DS博客作业02--线性表
    c博客06-结构
    c博客作业05--指针
    C博客作业04--数组
    博客作业03-函数
    循环结构
    c博客作业01--分支、顺序结构
    我的第一篇博客
    Macos安装JDK1.8
  • 原文地址:https://www.cnblogs.com/SovietPower/p/9350148.html
Copyright © 2011-2022 走看看