题目
题目解析
读完这道题,我们很快能想起dp求最大路径和,然而这是要同时找到两条路径,还不带重样的,这怎么办呢?
- 我们很快想到:同时维护两个位置的dp,每个位置的dp代表起点到达该位置的最大路径和。
图解:
题目也确实就是这样解开的,那么问题又出现了,如何保证这两条路径不是同一个路径呢?我们需要维护一个四维数组,该数组记录起点到达两个位置的最佳答案,在进行更新时我们不更新除到达终点外的任意两个位置相同的情况,因为一旦把这种情况进行更新,那在到达真正终点的中间过程便会出现两条重样的最佳路径和相加。
所以在到达终点前,我们对两个位置相同的情况进行跳过处理。
因为就算到了终点,上一个dp的选择也不可能是两个重复的位置,因为这样的位置不会被更新!
if ((x1 < m || y1 < n) && x1 == x2 && y1 == y2)
continue;
根据以上思路得到状态转移方程:
dp[x1][y1][x2][y2]=max(
dp[x1-1][y1][x2-1][y2],dp[x1][y1-1][x2-1][y2]
,dp[x1][y1-1][x2][y2-1],dp[x1-1][y1][x2][y2-1]
)
+map[x1][y1]+map[x2][y2];
- 但我们很快意识到出现了一个问题—时间复杂度太高了!为O(n^4)能否再进行优化呢?
答案是肯定的
我们一起来找一个规律:
假如现在是 5 x 5 的矩阵,每个人从起点走三步,会出现四种情况。
这四种情况的坐标分别为:(0,3)(1,2) (2,1) (3,0)
。通过这四个坐标,发现一个规律:0 + 3 = 1 + 2 = 2 + 1 = 3 + 0 = 3 = k
(k为走的步数)。所有,x1 + y1 = k
,x2 + y2 = k
。所以,y = k - x。
y = k - x,我们不需要对y进行遍历了,我们只需要加入一个k便可只第k步下的y是多少,所以减少了一层循环。
因此转移方程优化为:
dp[k][x1][x2]=max(
dp[k-1][x1][x2],
dp[k-1][x1-1][x2-1],
dp[k-