耗费了两晚上的时间( 还有紫书的帮助 ),终于理解了动态规划的实现,或者说详细步骤?大概吧,这对于理解力强的大佬来说没什么难度
动态规划的核心很多文章都有讲到,就是一个状态转移方程,这方面我也不多说了,可以自行百度
这个状态转移方程对于初学者来说或许不难,但是会很难理解详细的实现步骤,下面上一个模板题,简单讲一下遍历过程
[IOI1994][USACO1.5]数字三角形 Number Triangles
这个题在当年据说难倒了国家队队员,现在已经是萌新入门拿来练手的题了
核心方程
详细的题目我不在这里赘述,下面贴代码(这只是其中一种做法,递推实现),我用的是二维数组,方便理解,可以优化成一维
1 |
|
为什么要从倒数第二层开始推呢?
因为倒是第二层再往下就是最后一层了啊(雾
举个例子
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
我们从倒数第二层开始找,2可以和4或5相加,很明显,5是最优解,于是我们在tree(4)(1)存入2 + 5 = 7
倒数第二层还没找完,我们继续从7开始找,7可以和5或2相加,5是最优解,于是在tree(4)(2)存入 7 + 5 = 12
以此类推,搜完倒数第二层,这个三角形会变为
7
3 8
8 1 0
7 12 10 10
4 5 2 6 5
剩下3层也如此类推,最顶层很明显就是正解了
然而这么简单的题我用了两晚上时间来理解orz(我好菜啊)