Algorithm 动态规划得到最大菱形

Algorithm 动态规划得到最大菱形,algorithm,matrix,dynamic,greedy,correctness,Algorithm,Matrix,Dynamic,Greedy,Correctness,我试图解决一个面试问题,那就是: 给定一个n*n的矩阵。每个单元格包含0,1,-1。0表示有 没有钻石,但有一条路。1表示该位置有钻石 具有路径的位置 -1表示路径被阻塞。现在您已经从0,0开始,到达最后一个单元格,然后返回到0,0收集最大数量的 钻石。在进入最后一个单元格时,只能左右移动。 返回时,您只能向左和向上移动 我已经解决了这个问题,但我不确定这是否是最佳解决方案。我正在做的是 不是从最后一个单元返回到第一个单元,而是允许从第一个单元到最后一个单元进行2次迭代 当我进行第一次迭代时,

我试图解决一个面试问题,那就是:

给定一个n*n的矩阵。每个单元格包含0,1,-1。0表示有 没有钻石,但有一条路。1表示该位置有钻石 具有路径的位置 -1表示路径被阻塞。现在您已经从0,0开始,到达最后一个单元格,然后返回到0,0收集最大数量的 钻石。在进入最后一个单元格时,只能左右移动。 返回时,您只能向左和向上移动

我已经解决了这个问题,但我不确定这是否是最佳解决方案。我正在做的是

  • 不是从最后一个单元返回到第一个单元,而是允许从第一个单元到最后一个单元进行2次迭代
  • 当我进行第一次迭代时,我将尝试使用动态规划获得最大数量的钻石,然后我将从矩阵中删除第一次迭代中收集的钻石,即:从1中设置矩阵值0
  • 在第二次迭代中,我将调用与第一次迭代相同的方法,但使用修改后的矩阵
  • 并返回两个调用的总和
关于正确性有什么建议吗?
我已经编写了代码,如果需要,我将与大家分享。

您的算法不正确。 下面是一个反例:


1.
1.
1.
1.
1.
1.
0
1.
1.

您可以使用动态编程。 您需要用大小[2*n-1,n,n]填充矩阵 式中,DP[A,B,C]等于对角线(或总路径长度)A的最佳结果,第一条路径进入位置B,第二条路径进入位置C

从DP[0,0,0]开始,到DP[2*n-1,0,0]结束 答案为DP[2*n-1,0,0]

DP[l,i,j]=最大值(DP[l-1,i,j],DP[l-1,i-1,j-1],DP[l-1,i-1,j-1])+钻石[i,l-i]+钻石[j,l-j],如果i等于j,则减少钻石[j,l-j]

跳过所有不可能的地方

总的复杂度为O(N^3)

“您必须从0,0开始,到达最后一个单元格,然后返回到0,0”

==“您必须从0开始,0到达最后一个单元格两次”

d:总距离

x1:x第一个的位置

x2:x第二个位置

y1:d-x1//可以使用

y2:d-x2//可以使用


dp[d][x1][x2]:从单元格(0,0)到单元格(x1,y1)以及从单元格(0,0)到单元格(x2,y2)获得的最大菱形数

你是对的。对于以上给定的输入,我的算法可能不起作用。有任何修改算法的建议吗?如果我总是喜欢行而不是列(如果可能的话),我认为它应该起作用,或者我又漏掉了什么?如果您喜欢行而不是列,我将只转换我的示例,它将再次失败。矩阵中没有任何行和列的区别……不,如果你转换矩阵,它不会失败如果是1 1 0 1 1 1 1 1,那么我的查找矩阵将是:1 2 2 3 3 4 5 5,所以在第一次迭代后,修改后的矩阵将是:0 0 0 1 0 1 1 0。抱歉,我不知道如何在这里以良好的格式编写矩阵。我认为Khatri是对的:转置或不转置,至少这个示例将通过一个总是倾向于向右的算法来解决,或者通过一个总是倾向于下降的算法。正如@Petar Ivanov所说,贪婪可能不起作用,我认为这是一个问题,您可以使用dynamic解决它programming@F.Ju这是我的代码:你能给我一个这样的例子,它将失败。请注意,只要可能,我总是优先考虑行而不是列。对于2个例子,只要我的算法运行良好。可能相关:@F.Ju任何反例?请提供一个字段大小和所需输出路径或收集的钻石的唯一计数。我仍然不知道2*n-1是什么意思,您能告诉我DP的第一维度的含义以及如何填充它吗?DP[0,I,j]是什么?更多详细信息请参见此处