1. 程式人生 > >bzoj 1037: [ZJOI2008]生日聚會Party

bzoj 1037: [ZJOI2008]生日聚會Party

DP真強 什麼都能做

 

/**************************************************************
    Problem: 1037
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:200 ms
    Memory:59476 kb
***************************************************************
*/   /*     f[i][j][x][y]     i個男生 j個女生 所有後綴中 男-女最大為x 女減男最大為y     Dp還真是啥都能做     遇到資料小的儘量往DP上面去想 */ #include<cstdio> using namespace std; const int N=155; const int MOD=12345678; int n,m,k; int f[N][N][25
][25]; inline int max(int a,int b) {     return a>b?a:b; } void Solve() {     scanf("%d%d%d",&n,&m,&k);     f[0][0][0][0]=1;     for(int i=0;i<=n;i++)     for(int j=0;j<=m;j++)     
for(int x=0;x<=k;x++)     for(int y=0;y<=k;y++) if(f[i][j][x][y])     {         if(i+1<=n) (f[i+1][j][x+1][max(y-1,0)]+=f[i][j][x][y])%=MOD;         if(j+1<=m) (f[i][j+1][max(x-1,0)][y+1]+=f[i][j][x][y])%=MOD;         // x+1 y+1超過了k也不所謂 因為我們只統計不大於k的部分     }     int ans=0;     for(int x=0;x<=k;x++)     for(int y=0;y<=k;y++) (ans+=f[n][m][x][y])%=MOD;     printf("%d\n",ans); } int main() {     Solve();     return 0; }