dp解决同时找两条最大路径和问题--蓝桥杯传纸条

本文介绍了如何使用动态规划解决寻找矩阵中两条互不重合的最大路径和问题。首先,通过四维数组实现,然后通过观察得出路径坐标之间的关系,优化为三维数组,降低时间复杂度至O(n^3)。文章详细阐述了状态转移方程的建立及优化过程,并提供了两种解题代码示例。
摘要由CSDN通过智能技术生成

题目

如果不是同时找出两条不一样的路径和,那就一下子能秒了

题目解析

读完这道题,我们很快能想起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 = kx2 + 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-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值