Ural 1017

来源:互联网 发布:单片机红外线报警器 编辑:程序博客网 时间:2024/05/18 01:38

题意: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的那个方程到复制时间

代码:

 

 

 

原创粉丝点击