bzoj 1037 [ZJOI2008]生日聚会Party(DP)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1037 [ZJOI2008]生日聚会Party(DP)相关的知识,希望对你有一定的参考价值。

 

【题目链接】

 

    http://www.lydsy.com/JudgeOnline/problem.php?id=1037

 

【题意】

 

    一排n男m女,求满足任意连续段男女人数之差不超过k的数目。

 

【思路】

 

    DP

    设f[a][b][c][d]表示a男m女,男生女生人数最大差为c,女生男生人数最大差为d的方案数,则有转移方程:

    f[a+1][b][c+1][max(d-1,0)]<-f[a][b][c][d]

    f[a][b+1][max(c-1,0)][d+1]<-f[a][b][c][d]

  太神辣 -<

 

【代码】

 1 #include<cstdio>
 2 #include<iostream>
 3 #define FOR(a,b,c) for(int a=b;a<=c;a++)
 4 using namespace std;
 5 
 6 const int N = 200;
 7 const int MOD = 12345678;
 8 
 9 int f[N][N][25][25];
10 int n,m,K;
11 
12 int main()
13 {
14     scanf("%d%d%d",&n,&m,&K);
15     f[0][0][0][0]=1;
16     FOR(a,0,n) FOR(b,0,m) 
17         FOR(c,0,K) FOR(d,0,K)
18         if(f[a][b][c][d]) {
19             if(a<n&&(c<K)) {
20                 f[a+1][b][c+1][max(d-1,0)]=(f[a+1][b][c+1][max(d-1,0)]+f[a][b][c][d])%MOD;
21             } 
22             if(b<m&&d<K) {
23                 f[a][b+1][max(c-1,0)][d+1]=(f[a][b+1][max(c-1,0)][d+1]+f[a][b][c][d])%MOD;
24             }
25         }
26     int ans=0;
27     FOR(c,0,K) FOR(d,0,K)
28         ans=(ans+f[n][m][c][d])%MOD;
29     printf("%d\n",ans);
30 }

 

以上是关于bzoj 1037 [ZJOI2008]生日聚会Party(DP)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1037: [ZJOI2008]生日聚会Party

bzoj 1037: [ZJOI2008]生日聚会Party

bzoj 1037 [ZJOI2008]生日聚会Party(DP)

Bzoj1037 [ZJOI2008]生日聚会Party

bzoj1037: [ZJOI2008]生日聚会Party

BZOJ1037 [ZJOI2008]生日聚会Party