(注意在poj提交时换掉代码中的万能头)
第1排站在最后边,第 k排站在最前边
学生的身高互不相同,把他们从高到底依次标记为 1,2,…,N
在合影时要求每一排从左到右身高递减,每一列从后到前身高也递减
问前数排15后数排14一共哆少人有多少种安排合影位置的方案?
下面的一排三角矩阵给出了当 N=6,k=3,N1=3,N2=2,N3=1 时的全部16种合影方案注意身高最高的是1,最低的是6
输入包含多组測试数据。
每组数据两行第一行包含一个整数k表示总排数。
第二行包含k个整数表示从后向前每排的具体人数。
当输入k=0的数据时表示輸入终止,且该数据无需处理
每组测试数据输出一个答案,表示不同安排的数量
1≤k≤5,学生总人数不超过30人。
来源:《算法竞赛进阶指喃》 |
- 首先我们可以看到k小于等于5对于每个人我们需要决定这个人放在哪个位置
- 如果从高到低依次安排每个同学位置,那么在安排过程中当前同学一定占据某排最靠左的某个位置,并且安排后从后往前每排人数单调递减
- 考虑到k小于等于5我们可以考虑用每排的人数去表示當前排列形式的方案数,即用f[a][b][c][d][e]表示第一排人数为a第二排人数为b。。的方案数
- 对于f[a][b][c][d][e]的排列形式,是由最后一个人安排在第一排第二排或第三排等等决策得来的,那么可以由下面的代码进行计算
-
- 注意前一排人数要小于后一排,数组太大建议在main函数里根据实际需要定義数组或vector大小,或者用for循环根据需要初始化这会大大加快程序速度(1175ms -> 2ms)