[bzoj1037] [ZJOI2008]生日聚会Party
题意:有n个男生m个女生排成一排 求让这一排中任意一段的男女生数量之差不大于k的方案数量。
n,m<=150,k<=20
f[i][j][k][l]表示i个男生j个女生 后缀中男生-女生的最大值为k 女生-男生的最大值为l 的方案数
#include<iostream> #include<cstdio> #define mod 12345678 using namespace std; int n,m,k; int f[155][155][25][25]; inline int abs(int x){return x<0?-x:x;} bool check(int x){return abs(x)<=k;} int main() { scanf("%d %d %d",&n,&m,&k); if(abs(n-m)>k) return 0*puts("0"); 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(check(x-y)) { f[i+1][j][x+1][max(0,y-1)]=(f[i+1][j][x+1][max(0,y-1)]+f[i][j][x][y])%mod; f[i][j+1][max(0,x-1)][y+1]=(f[i][j+1][max(0,x-1)][y+1]+f[i][j][x][y])%mod; } int ans=0; for(int x=0;x<=k;x++) for(int y=0;y<=k;++y) ans=(ans+f[n][m][x][y])%mod; printf("%d",ans); return 0; }
FallDream代表秋之国向您问好!
欢迎您来我的博客www.cnblogs.com/FallDream