先看题目吧:
我们用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)
分析:
最开始拿到这道题,直觉就是把a*b化成更简单的,怎么化简,试了很多种,结果都不理想,后来没办法,直接上暴力穷举,呵呵,对于a,b,c,只要都不超过5,那么还是瞬间就得到答案了,可是,》=5时,时间就成几何级增加。
还是说说可行的解题思路:
考虑最后一个格子n[a][b],可以堆放的木块数为(0~c)种,
在考虑其右侧的格子n[a][b-1],
当n[a][b-1]=c,那么n[a][b]可以取(c),共1种
当n[a][b-1]=c-1,那么n[a][b]可以取(c-1~c),共2种
.........................................................................
当n[a][b-1]=0,那么n[a][b]可以取(0~c),共有c+1种
同理,可以推出
当n[a][b-2]=c,那么n[a][b-1]可以取(c),共1种
当n[a][b-2]=c-1,那么n[a][b-1]可以取(c-1~c),共1+2=3种
可以看出,右侧的格子是左侧格子分别取每种状态的和,当然,这只是求出来的一行的情况
下面就要考虑多行,毕竟a不可能只等于1
前面分析列的思路可以用到分析行,只是有一点需要注意,结果集并不是单调递增的,在上面分析的时候,取值0~c是单调递增的,而分析行就不一定了,
距离来说a,b,c为2,2,3
行有{(0,0),(1,0),(2,0),(1,1),(2,1),(2,2)六种情况
其中(2,0)和(1,1)就不存在单调递增情况,所以要进行分类,即大于(0,0)的是那些,大于(1,0)是那些
然后从最上面一行往下分析,就可以得到答案了
结果就能很快计算出来。