Ural 1017

题意:N个砖块按照严格递增到顺序建造楼梯,且楼梯阶数至少为2,求有多少种方法

WA:根本就想不到状态转移方程。。。

方法:这是我们戒dota生涯的第一个题目,也彻底证明了咱到DP水平是何其之低。。。刚刚拿过来到时候没有任何思路,如果只是记录i个方块对应的方法数的话,是无法由i-1推至i的,因为这样无法限定条件。后来学习了大牛们到思想,才AC了。。

           最朴素的思路是n^3的,令f[i][j]表示i个砖块高度为j可形成到方法数,则可以知道 f[i][j] = Σf[i-j][k] 其中(0 <= j <=i, 0 <= k < j )

代码: 注意都要用longl long 最后的 ans忘了long long 在第六组WA了

 

然后发现大牛们有一种n^2的算法,关键在于f[[i][j] 表示到是i个砖块最大高度为j的方法数,这样状态转移方程即是

f[i][j] = f[i][j-1] + f[i-j][j-1]  边界为f[0][0] 为1,其余为0,可参见http://blog.csdn.net/zxddavy/archive/2010/11/22/6027883.aspx

注意不用滚动数组到时候要考虑 当 i < j到时候 方程就变了,是 f[i][j] = f[i][j-1] (i < j)

 

观察这个方程可知,j只与j-1有关,于是我们可以用滚动数组,但是j作为列就不好滚动了,很简单,把i和j交换即可,这样不仅省了空间,而且省去了i < j的那个方程到复制时间

代码:

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值