【剑指Offer】面试题47:礼物的最大价值

题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿多少价值的礼物?

思路 1:动态规划

这是一道典型的动态规划的问题,“第 i 行 j 列的格子所对应的礼物的最大价值”= max(“第 i - 1 行 j 列的格子所对应的礼物的最大价值”, “第 i 行 j - 1 列的格子所对应的礼物的最大价值”)。很明显,这是一个带有重复子问题的动态规划,我们将状态转移方程公式化如下:

$$f(i,j)=max(f(i-1,j),f(i,j-1))$$

其中,f(i, j) 表示第 i 行 j 列的格子所对应的礼物的最大价值。

我们默认使用二维数组来记录每一个格子所对应的礼物的最大价值。实际上,这里可以优化,因为第 i 行 j 列的格子所对应的礼物的最大价值只与第 i 行和第 i - 1 的格子所对应的礼物的最大价值有关,因此我们可以只使用一个一维数组来记录子问题的解,最后一步一步的得到最终问题的解。