Homework Introduction
// f[a1][a2][a3][a4][a5]
// 第一个行有 a1 个数字
// 第二行有 a2 个数字
// ...
// 第 5 行有 a5 个数字的方案总数
// f[0][0][0][0][0] =1
#include <bits/stdc++.h>
using namespace std;
const int N = 31;
long long f[N][N][N][N][N];
int T, k;
int a[N];
int main() {
while (cin >> k) {
if (k == 0)
break;
memset(f, 0, sizeof(f));
memset(a, 0, sizeof(a));
for (int i = 1; i <= k; i++)
cin >> a[i];
f[0][0][0][0][0] = 1;
for (int a1 = 0; a1 <= a[1]; a1++)
for (int a2 = 0; a2 <= a[2]; a2++)
for (int a3 = 0; a3 <= a[3]; a3++)
for (int a4 = 0; a4 <= a[4]; a4++)
for (int a5 = 0; a5 <= a[5]; a5++) {
if (f[a1][a2][a3][a4][a5] == 0)
continue;
// 填充第一行 , 最多能填 a[1]
if (a1 < a[1])
f[a1 + 1][a2][a3][a4][a5] += f[a1][a2][a3][a4][a5];
// 填充第二行 , 不能悬空
if (a2 < a[2] && a2 < a1)
f[a1][a2 + 1][a3][a4][a5] += f[a1][a2][a3][a4][a5];
// 三
if (a3 < a[3] && a3 < a2)
f[a1][a2][a3 + 1][a4][a5] += f[a1][a2][a3][a4][a5];
// 4
if (a4 < a[4] && a4 < a3)
f[a1][a2][a3][a4 + 1][a5] += f[a1][a2][a3][a4][a5];
// 5
if (a5 < a[5] && a5 < a4)
f[a1][a2][a3][a4][a5 + 1] += f[a1][a2][a3][a4][a5];
}
cout << f[a[1]][a[2]][a[3]][a[4]][a[5]] << endl;
}
return 0;
}
Problem
- Status
- Done
- Problem
- 28
- Open Since
- 2025-10-14 0:00
- Deadline
- 2025-10-21 23:59
- Extension
- 24 hour(s)