題目鏈接
http://poj.org/problem?id=2279
分析
的範圍很小,設狀態爲 ,考慮可以從哪些狀態轉移得來;
顯然是那些合法的,且人數比該狀態恰好少 的;
我們假定從 到 依次安排,則合法狀態要求 。
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;
}