bzoj 1037 [ZJOI2008]生日聚会Party dp
Posted copperoxide
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1037 [ZJOI2008]生日聚会Party dp相关的知识,希望对你有一定的参考价值。
题面
解法
可以发现,每一次只要考虑后缀的一部分即可
设(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 << "
";
return 0;
}
以上是关于bzoj 1037 [ZJOI2008]生日聚会Party dp的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1037: [ZJOI2008]生日聚会Party