堆放木块是题很有意思的题目,原题的描述为:
我们用2维数组n[i][j] 表示平面上凸起的高度。或者说在二维平面上堆放立方体,满足 (每个数组元素都是非负整数)
n[i][j] <= n[i][j+1] n[i][j] <= n[i+1][j]
如图所示,是一种合法的方法。 对应的二维数组是:
5 4 2 1 1
3 2 0 0 0
2 2 0 0 0
(注意正方向是从下往上,从右往左) 给定a,b,c,其中a,b是2维数组的维数,c表示元素不超过c(即n[i,j] <= c),求满足条件的2维数组的数量。 (0<a,b,c<=6)
之前我就分析过了,这题与ferrers图有很大的联系,再看看Ferrers图:
ferrers图是一个从上而下的n层格子,mi 为第i层的格子数,当mi>=mi+1(i=1,2,,n-1) ,即上层的格子数不少于下层的格子数的图。
如下是一些ferrers图:
所以,可以看到,每个合理的摆放每一层都是一个ferrers图,且下层图的格子数不能比上层的格子数小,即每一列都不能小,然后至多堆放c层,这样,思路就有了
因为我不会写java,所以我先用c++实现打了个表,下面是我的C++代码实现;