码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 1037 [ZJOI2008]生日聚会Party dp

时间:2018-08-14 20:03:02      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:pre   时间   ++   ret   include   方案   math   problem   i++   

题面

题目传送门

解法

可以发现,每一次只要考虑后缀的一部分即可

\(f_{i,j,x,y}\)表示前\(i\)个人中\(j\)个是男生,后缀中男生数-女生数最大为\(x\),女生-男生最大为\(y\)的方案数

建议从前推后

时间复杂度:\(O(nmk^2)\)

代码

#include <bits/stdc++.h>
#define Mod 12345678
#define N 160
using namespace std;
int f[N << 1][N][25][25];
int main() {
    int n, m, k; cin >> n >> m >> k;
    f[0][0][0][0] = 1;
    for (int i = 0; i <= n + m; i++)
        for (int j = 0; j <= min(i, n); j++)
            for (int x = 0; x <= k; x++)
                for (int y = 0; y <= k; y++) {
                    if (j + 1 <= n) (f[i + 1][j + 1][x + 1][max(y - 1, 0)] += f[i][j][x][y]) %= Mod;
                    if (i + 1 - j <= m) (f[i + 1][j][max(x - 1, 0)][y + 1] += f[i][j][x][y]) %= Mod;
                }
    int ans = 0;
    for (int i = 0; i <= k; i++)
        for (int j = 0; j <= k; j++)
            for (int x = 0; x <= n; x++)
                ans = (ans + f[n + m][x][i][j]) % Mod;
    cout << ans << "\n";
    return 0;
}

bzoj 1037 [ZJOI2008]生日聚会Party dp

标签:pre   时间   ++   ret   include   方案   math   problem   i++   

原文地址:https://www.cnblogs.com/copperoxide/p/9476725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!