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;
}
Status
Done
Problem
28
Open Since
2025-10-14 0:00
Deadline
2025-10-21 23:59
Extension
24 hour(s)