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

     先看题目吧:

我们用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值