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 }