我将开始辅导,所以决定从我的算法课程中解决一些旧问题。问题如下:
你在卖报纸,并且每天你从一个十字路口开始你的行程,结束于你开始的东北方向。城市街道是网格状的,如下图所示,你从(0,0)出发,终点为(n,m)。
向北移动将把你从(x, y)带到(x, y +1)。向东移动将把你从(x, y)带到(x +1, y)。在每个交叉口(x, y)处,你停下来卖报纸,并且将获得收益r(x, y)。让OPT(n,m)表示从(0,0)到(n,m)的最优路径的总收益。
我使用自底向上的动态规划写了以下伪代码:
你在卖报纸,并且每天你从一个十字路口开始你的行程,结束于你开始的东北方向。城市街道是网格状的,如下图所示,你从(0,0)出发,终点为(n,m)。
向北移动将把你从(x, y)带到(x, y +1)。向东移动将把你从(x, y)带到(x +1, y)。在每个交叉口(x, y)处,你停下来卖报纸,并且将获得收益r(x, y)。让OPT(n,m)表示从(0,0)到(n,m)的最优路径的总收益。
我使用自底向上的动态规划写了以下伪代码:
Bottom-Up-Alg(n,m,s[][]) \\ n and m are coordinates and s holds the revenue at each coordinate (n,m)
opt = 0 \\ holds optimal revenue
opt += s[0][0] \\value at (0,0)
i = 0
j = 0
while (i <= n and j <= m)
if (s[i+1][j] > s[i][j+1])
opt += s[i+1][j] \\ Move east
i++
else
opt += s[i][j+1] \\ Move north
j++
return r
严格来说,该算法的运行时间为O(n+m)。但如果n和m成比例,则可以将其运行时间称为O(n)或O(m)。
问题在于,我发现我的算法是贪心的,并且它并不适用于每种情况。我很难编写泛化的伪代码。