堆放木块-c#求解-英雄会在线编程题目

来源:互联网 发布:淘宝号有订单信用清洗 编辑:程序博客网 时间:2024/04/29 14:10

     先看题目吧:

我们用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)是那些

然后从最上面一行往下分析,就可以得到答案了

 

结果就能很快计算出来。

0 0