POJ2279 Mr. Young's Picture Permutations 線性DP

題目鏈接

http://poj.org/problem?id=2279

分析

kk 的範圍很小,設狀態爲 f[a][b][c][d][e]f[a][b][c][d][e],考慮可以從哪些狀態轉移得來;

顯然是那些合法的,且人數比該狀態恰好少 11 的;

我們假定從 11nn 依次安排,則合法狀態要求 abcdea \geq b \geq c \geq d \geq e

AC代碼

#include <cstdio>
#include <cstring>

inline int read() {
	int num = 0;
	char c = getchar();
	while (c < '0' || c > '9') c = getchar();
	while (c >= '0' && c <= '9')
		num = num * 10 + c - '0', c = getchar();
	return num;
}

const int maxn = 35, maxk = 10;

int k, n[maxk];
long long f[maxn][maxn / 2][maxn / 3][maxn / 4][maxn / 5];

int main() {
	while (scanf("%d", &k) == 1 && k) {
		memset(n, 0, sizeof(n));
		for (int i = 1; i <= k; ++i) n[i] = read();
		memset(f, 0, sizeof(f));
		f[0][0][0][0][0] = 1;
		for (int a = 0; a <= n[1]; ++a)
			for (int b = 0; b <= n[2]; ++b)
				for (int c = 0; c <= n[3]; ++c)
					for (int d = 0; d <= n[4]; ++d)
						for (int e = 0; e <= n[5]; ++e) {
							if (a > b) f[a][b][c][d][e] += f[a - 1][b][c][d][e];
							if (b > c) f[a][b][c][d][e] += f[a][b - 1][c][d][e];
							if (c > d) f[a][b][c][d][e] += f[a][b][c - 1][d][e];
							if (d > e) f[a][b][c][d][e] += f[a][b][c][d - 1][e];
							if (e) f[a][b][c][d][e] += f[a][b][c][d][e - 1];
						}
		printf("%lld\n", f[n[1]][n[2]][n[3]][n[4]][n[5]]);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章