1037: [ZJOI2008]生日聚会Party

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1037

dp。f[i][j][k1][k2]表示前i个人中有j个男孩,其中男孩最多比女孩多k1人,女孩最多比男孩多k2人(负数都用0代替)。
用当前状态推下一状态:f[i+1][j+1][k1+1][k2-1]+=f[i][j][k1][k2];f[i+1][j][k1-1][k2+1]+=f[i][j][k1][k2]。
边界f[0][0][0][0]=1。

#include <iostream>
#include 
<cstdio>
#include 
<cstring>
#include 
<algorithm>
using namespace std;
const int MaxN=151;
const int MaxK=21;
const int mod=12345678;

int n,m,k,f[2*MaxN][MaxN][MaxK][MaxK];

int main()
{
    cin
>>n>>m>>k;
    memset(f,
0,sizeof(f));
    f[
0][0][0][0]=1;
    
for (int i=0;i<n+m;i++)
        
for (int j=0;j<=min(i,n);j++)
            
for (int k1=0;k1<=min(j,k);k1++)
                
for (int k2=0;k2<=min(i-j,k);k2++)
                
{
                    
if (k1<&& j<n) f[i+1][j+1][k1+1][max(k2-1,0)]=(f[i+1][j+1][k1+1][max(k2-1,0)]+f[i][j][k1][k2])%mod;
                    
if (k2<&& (i-j)<m) f[i+1][j][max(k1-1,0)][k2+1]=(f[i+1][j][max(k1-1,0)][k2+1]+f[i][j][k1][k2])%mod;
                }

    
int ans=0;
    
for (int k1=0;k1<=k;k1++)
        
for (int k2=0;k2<=k;k2++)
        
{
            ans
=(ans+f[n+m][n][k1][k2])%mod;
        }

    cout
<<ans<<endl;
    
return 0;
}


 

posted on 2013-02-13 23:59 Kiro 阅读(218) 评论(0)  编辑 收藏 引用 所属分类: 衡八oj