#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int const N = 31;
LL f[N][N][N][N][N];
int n;
int main(){
while(scanf("%d", &n), n){
memset(f, 0, sizeof f);
f[0][0][0][0][0] = 1;
int k[5] = {0};
for(int i = 0 ; i < n; i++) scanf("%d", &k[i]);
for(int a = 0; a <= k[0]; a++)
for(int b = 0; b <= min(a, k[1]); b++)
for(int c = 0; c <= min(b, k[2]); c++)
for(int d = 0; d <= min(c, k[3]); d++)
for(int e = 0; e <= min(d, k[4]); e++){
LL &v = f[a][b][c][d][e];
if(a && a-1>=b) v += f[a-1][b][c][d][e];
if(b && b-1>=c) v += f[a][b-1][c][d][e];
if(c && c-1>=d) v += f[a][b][c-1][d][e];
if(d && d-1>=e) v += f[a][b][c][d-1][e];
if(e) v += f[a][b][c][d][e-1];
}
printf("%lld\n", f[k[0]][k[1]][k[2]][k[3]][k[4]]);
}
return 0;
}
思路
先放最矮的,当是三角形的时候,可以随便放,但如果出现矩形,只能放最前排。
用集合的思想来聚合方案总类。造成空间的划分。