luogu 2592 区间dp

\(f_{i, j, a, b}\) 表示当前一共有 \(i\) 人排队, \(j\) 名男生,男生数目 - 女生数目为 \(a\), 女生数目 - 男生数目为 \(b\)\(a, b >= 0\)
转移显然

#include <bits/stdc++.h>

const int N = 160, Mod = 12345678;

int f[N << 1][N][25][25];
int n, m, k;

int main() {
	std:: cin >> n >> m >> k;
	f[0][0][0][0] = 1;
	for(int i = 0; i < n + m; i ++)
		for(int j = 0; j <= n; j ++)
			for(int a = 0; a <= k; a ++)
				for(int b = 0; b <= k; b ++) {
					if(f[i][j][a][b]) {
						if(a + 1 <= k && j + 1 <= n)
							(f[i + 1][j + 1][a + 1][std:: max(b - 1, 0)] += f[i][j][a][b]) %= Mod;
						if(b + 1 <= k && i - j + 1 <= m)
							(f[i + 1][j][std:: max(a - 1, 0)][b + 1] += f[i][j][a][b]) %= Mod;
					}
				}
	int Answer = 0;
	for(int p = 0; p <= n; p ++)
		for(int i = 0; i <= k; i ++) 
			for(int j = 0; j <= k; j ++) 
				(Answer += f[n + m][p][i][j]) %= Mod;
	std:: cout << Answer;
	return 0;
}
posted @ 2018-09-20 14:36  xayata  阅读(107)  评论(1编辑  收藏  举报