bzoj1037[ZJOI2008]生日聚会
题意:
一排小孩坐着玩游戏。就座的方案满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k。给出男孩数,女孩数和k,求就座方案数除以12345678的余数。
题解:
dp方程见程序,i1i2表示当前选了几男几女,i3i4分别表示当前男比女多几个和女比男多几个。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define mod 12345678 6 using namespace std; 7 8 int f[160][160][30][30]; 9 int main(){ 10 int n,m,k; scanf("%d%d%d",&n,&m,&k); 11 f[0][0][0][0]=1; 12 inc(i1,0,n)inc(i2,0,m)inc(i3,0,k)inc(i4,0,k){ 13 if(i1!=n&&i3!=k)f[i1+1][i2][i3+1][max(i4-1,0)]=(f[i1+1][i2][i3+1][max(i4-1,0)]+f[i1][i2][i3][i4])%mod; 14 if(i2!=m&&i4!=k)f[i1][i2+1][max(i3-1,0)][i4+1]=(f[i1][i2+1][max(i3-1,0)][i4+1]+f[i1][i2][i3][i4])%mod; 15 } 16 int ans=0; 17 inc(i1,0,k)inc(i2,0,k)ans=(ans+f[n][m][i1][i2])%mod; 18 printf("%d",ans); 19 }
20160322