[bzoj1037]生日聚会
dp,用f[i][j][x][y]表示i个男孩,j个女孩,以i+j为结尾的子序列男-女最多为x,女-男最多为y的合法方案数,转移到f[i+1][j][x+1][max(y-1,0)]和f[i][j+1][max(x-1,0)][y+1](注意要保证x和y不超过k)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define add(x,y) x=(x+y)%12345678 4 int n,m,k,ans,f[205][205][25][25]; 5 int main(){ 6 scanf("%d%d%d",&n,&m,&k); 7 f[0][0][0][0]=1; 8 for(int i=0;i<=n;i++) 9 for(int j=0;j<=m;j++) 10 for(int x=0;x<=k;x++) 11 for(int y=0;y<=k;y++){ 12 if ((i<n)&&(y<k))add(f[i+1][j][max(x-1,0)][y+1],f[i][j][x][y]); 13 if ((j<m)&&(x<k))add(f[i][j+1][x+1][max(y-1,0)],f[i][j][x][y]); 14 } 15 for(int i=0;i<=k;i++) 16 for(int j=0;j<=k;j++)add(ans,f[n][m][i][j]); 17 printf("%d",ans); 18 }