bzoj1037[ZJOI2008]生日聚会

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

posted @ 2016-07-09 22:40  YuanZiming  阅读(168)  评论(0编辑  收藏  举报