HYSBZ/BZOJ 1037 [ZJOI2008] 生日聚会Party - dp

来源:互联网 发布:浙江网络诈骗立案标准 编辑:程序博客网 时间:2024/05/18 19:20

题目描述

分析:

dp[i][j][p][q]表示前i个boy,j个girl,男孩数量-女孩数量的最大值为p,女孩数量-男孩数量的最大值为q。因为可能没有女孩或者男孩,p,q可能为负数,就用0表示(p,q是最大值,p,q为负的情况只有没有女孩或者没有男孩这种情况)

dp[i][j][p][q]=dp[i-1][j][p-1][q+1] + dp[i][j-1][p+1][q-1]
没办法填表,用刷表法:
dp[i][j][p][q] 影响 dp[i+1][j][p+1][q-1] 和 dp[i][j+1][p-1][q+1]

#include<cstdio>#include<algorithm>using namespace std;#define Mod 12345678#define MAXN 150#define MAXK 20int n,m,k,dp[MAXN+5][MAXN+5][MAXK+5][MAXK+5],ans;int main(){    scanf("%d%d%d",&n,&m,&k);    //dp[i][j][p][q] -> dp[i+1][j][p+1][q-1] , dp[i][j+1][p-1][q+1]    dp[0][0][0][0]=1;    for(int i=0;i<=n;i++)        for(int j=0;j<=m;j++){            for(int p=0;p<=k;p++)                for(int q=0;q<=k;q++){                    dp[i+1][j][p+1][max(q-1,0)]=(dp[i+1][j][p+1][max(q-1,0)]+dp[i][j][p][q])%Mod;                    dp[i][j+1][max(p-1,0)][q+1]=(dp[i][j+1][max(p-1,0)][q+1]+dp[i][j][p][q])%Mod;                }        }    for(int p=0;p<=k;p++)        for(int q=0;q<=k;q++){            ans=(ans+dp[n][m][p][q])%Mod;    }    printf("%d\n",ans%Mod);}
0 0
原创粉丝点击