Python 总和小于或等于给定数字的2D数组中的最大成本值

Python 总和小于或等于给定数字的2D数组中的最大成本值,python,algorithm,matrix,dynamic-programming,Python,Algorithm,Matrix,Dynamic Programming,给定一个2D数组和一个数字K 问题:我们有一个矩阵cost[][],矩阵的每个单元格表示遍历该单元格的成本。我们从左上角的(0,0)开始,必须到达最后一个单元格(右下角)。我必须编写一个函数,返回最大成本路径的成本,以达到(m,n),而不超过K 到达(m,n)路径的总成本是该路径上所有成本(包括源和目标)的总和,该总和应小于或等于K。我们只能向下移动,向右移动或向右斜向下移动 如果找不到最大和小于或等于K的路径,则返回-1,矩阵的值不能为负值 解决方案:我尝试了很多代码,但都没有返回我期望的结果

给定一个2D数组和一个数字
K

问题:我们有一个矩阵
cost[][]
,矩阵的每个单元格表示遍历该单元格的成本。我们从左上角的
(0,0)
开始,必须到达最后一个单元格(右下角)。我必须编写一个函数,返回最大成本路径的成本,以达到
(m,n)
,而不超过
K

到达
(m,n)
路径的总成本是该路径上所有成本(包括源和目标)的总和,该总和应小于或等于
K
。我们只能向下移动,向右移动或向右斜向下移动

如果找不到最大和小于或等于
K
的路径,则返回
-1
,矩阵的值不能为负值

解决方案:我尝试了很多代码,但都没有返回我期望的结果

我的第一个解决方案是在一个简单的数组中转换2D数组,并应用背包算法,但它不起作用,因为逻辑上没有遵循路径。(这个想法让演习的逻辑消失了)

我还尝试了一个递归公式,但没有成功。我得到一个错误“最大递归深度”。 当我解决这个递归问题时,我的算法没有考虑到不能超过的数量的限制

我不需要代码,我只需要一些解释就能解决问题(特别是数学公式)。 谢谢

例如:

    if we had this 3*3 matrix:
    cost[][] = {{2,3,1}, {6,1,9},{8,2,3}}
    and k = 7

答案应该是
6:(0,0)->(1,1)->(3,3)

如果我们认为它是在从结束到开始的过程中减去成本,寻找剩余的最小非负幅度,那么简单的重复可能是如下所示。记忆递归有时比全维
k
上的迭代更合适,因为许多输入可以产生特殊的和集

函数g(m,K,i,j,K,memo){
if(k<0 | | i<0 | | j<0)
返回K+1;
如果(i==0&&j==0)
返回k>=m[i][j]?k-m[i][j]:k+1;
常量键=字符串([i,j,k]);
if(备注hasOwnProperty(键))
返回备忘录[键];
返回备忘录[键]=Math.min(
g(m,K,i-1,j,K-m[i][j],备忘录),
g(m,K,i,j-1,K-m[i][j],备忘录),
g(m,K,i-1,j-1,K-m[i][j],备忘录)
)
}
函数f(m,k){
返回k-g(m,k,m.length-1,m[0].length-1,k,{});
}
var m=[
[2,3,1],
[6,1,9],
[8,2,3]
];
var k=7;

控制台日志(f(m,k))
假设
dp[i][j]
是到达位置的成本
(i,j)
,那么成本取决于到达当前位置之前位置的成本:

  • 右下对角线
    (i-1,j-1)
  • 或向下一列
    (i-1,j)
  • 或右
    (i,j-1)
现在方程可以写成:

dp[i][j] = -1
if ( cost[i][j] < K ):
    dp[i][j] = if ( dp[i-1][j-1] != -1 and cost[i][j] + dp[i-1][j-1] <= K ) :
                  dp[i][j] = cost[i][j] + dp[i-1][j-1]

               if ( dp[i-1][j] != -1 and cost[i][j] + dp[i-1][j] <= K ) :
                  dp[i][j] = max( dp[i][j], cost[i][j] + dp[i-1][j] )

               if ( dp[i][j-1] != -1 and cost[i][j-1] + dp[i][j-1] <= K):
                  dp[i][j] = max( dp[i][j], cost[i][j] + dp[i][j-1] )
dp[i][j]=-1
如果(成本[i][j]dp[i][j]=if(dp[i-1][j-1]!=-1和cost[i][j]+dp[i-1][j-1]您对输入数组的大小或时间效率有任何限制吗?没有,对大小没有限制,目前我们必须做一个简单的算法(递归)首先和之后,我们必须使用动态编程来避免递归树上的重复工作。谢谢你的回答。没有必要给我算法,只是一个解释就足够了。但是对你很好。匿名啊,好吧。我想既然递归树如此紧凑,就很容易实现代码中的w。