有名的数塔问题,对于刚接触DP的同学,应该就是这题吧,这里说一下我的想法和官方的代码。
这题肯定是不可以用最原始的递归的,对于初学DP的同学,可能会用到DP的递归调用,那只是第一步,接着你会把递归的化成非递归的,然后你可能还会想到从下往上计算而不是从上往下计算,因为当你用从上往下计算时,要考虑数组是否越界(也就是没行的第一个,这个数的左上没有数,还有就是每一行的最后一个数,它的右上没有数,这个可以不考虑,数组已经开出来了,不过得初始化为0)。从下往上就不用考虑这么多了。其实考虑到这,基本也差不多了,但是似乎我们得开一个二维数组来存这些结果,可是对于这些结果我们用不着都存起来,当我们考虑到第i行时,我们只要考虑第i-1行就行了,第i-1行以前的所有结果我们都没必要存起来。那么我们就可以用两个一维数组存起来了一个是当前行的最优结果(也就是要算的),还有一个是上一行的最优结果。另外在01背包里面会用到这样的优化,有时不优化就会MLE。(代码建议自己想先,再参考)
贴一下从下往上算的:
CODE

下面的代码是官方给的(省内存)
CODE2