BZOJ1037: [ZJOI2008]生日聚会Party

DP…

 1 /**************************************************************
 2     Problem: 1037
 3     User: zhuohan123
 4     Language: C++
 5     Result: Accepted
 6     Time:448 ms
 7     Memory:1792 kb
 8 ****************************************************************/
 9  
10 #include <iostream>
11 #include <cstdio>
12 #include <cstring>
13 using namespace std;
14 inline int imax(int a,int b){return a>b?a:b;}
15 inline int imin(int a,int b){return a<b?a:b;}
16 const int mo=12345678;
17 inline int add(int &a,int b){a=(a+b)%mo;}
18 int f[2][151][21][21];
19 //f[总人数][男生数][男-女][女-男] P.S.最后两维若是负数则当为0 
20 int main(int argc, char *argv[])
21 {
22     int n,m,k;cin>>n>>m>>k;
23     f[0][0][0][0]=1;
24     for(int i=0;i<n+m;i++)
25     {
26         memset(f[(i+1)&1],0,sizeof f[(i+1)&1]);
27         for(int j=0;j<=imin(i,n);j++)
28             for(int bmg=0;bmg<=imin(j,k);bmg++)
29                 for(int gmb=0;gmb<=imin(i-j,k);gmb++)
30                 {
31                     if(bmg<k&&j<n)add(f[(i+1)&1][j+1][bmg+1][imax(gmb-1,0)],f[i&1][j][bmg][gmb]);
32                     if(gmb<k&&(i-j)<m)add(f[(i+1)&1][j][imax(bmg-1,0)][gmb+1],f[i&1][j][bmg][gmb]);
33                 }
34     }   
35     int ans=0;
36     for(int i=0;i<=k;i++)
37         for(int j=0;j<=k;j++)
38         add(ans,f[(n+m)&1][n][i][j]);
39     cout<<ans<<endl;
40     return 0;
41 }

 

posted @ 2013-08-16 19:01  zhuohan123  阅读(603)  评论(0编辑  收藏  举报