Javascript 动态规划在二维数组中寻找带约束的最大路径
嗨,我在dp中有一个问题是这样的: 输入:二维数字数组 输出:从(0,0)到(n-1,n-1)的路径的最大和,其中需要满足以下两个条件:Javascript 动态规划在二维数组中寻找带约束的最大路径,javascript,node.js,arrays,typescript,algorithm,Javascript,Node.js,Arrays,Typescript,Algorithm,嗨,我在dp中有一个问题是这样的: 输入:二维数字数组 输出:从(0,0)到(n-1,n-1)的路径的最大和,其中需要满足以下两个条件: 您只能向下和向右移动,这意味着: (A[i-1][j])-->(A[i][j])或(A[i][j-1])-->(A[i][j]) 不能在一行中水平移动三次 到目前为止,我的代码是: 导出默认值(arr:Array)=>{ 设B:Array=init2DArr(arr.length,arr[0].length)//何时 B[0][0]={info:arr[
导出默认值(arr:Array)=>{
设B:Array=init2DArr(arr.length,arr[0].length)//何时
B[0][0]={info:arr[0][0],rightCount:0};
for(设i=1;i=3){
B[i][j]={info:arr[i][j]+B[i][j-1]。信息,rightCount:B[i][j-1]。rightCount+1}
继续;
}
if(B[i][j-1].rightCount==2){
B[i][j]={info:arr[i][j]+B[i-1][j]。信息,rightCount:0}
继续;
}
如果(B[i-1][j].info>=B[i][j-1].info){//top
B[i][j]={info:arr[i][j]+B[i-1][j]。信息,rightCount:0}
}
else if(B[i][j-1].info>B[i-1][j].info)
{
B[i][j]={info:arr[i][j]+B[i][j-1]。信息,rightCount:B[i][j-1]。rightCount+1}
}
}
}
log(B[arr.length-1][arr.length-1].info)
}
常量init2DArr=(n:number,m:number)=>{
设res=数组(n);
for(设i=0;i
但此代码不完整,因为对于此输入:
getMaxPath([[1,1,1,1],
[7,9,4,2000],
[6,22,1,1],
[1,1,1,1]])
2000不包括在路径中,即使路径:
1->1->9->4->2000->1->1
这显然是最大的
因此,代码应该返回2017(路径的总和)
这意味着我的代码并没有对所有可能的路径进行求值。
任何帮助都将不胜感激您可以采取暴力手段,获得所有可能和有效的路径,并选择金额最大的路径 函数getMaxPath(矩阵){ 常数 sum=array=>array.reduce((a,b)=>a+b), 堆栈=[[0,0',,0,[]], 路径=[]; while(堆栈长度){ 常量[i,j,dir,count,[…path]]=stack.shift(); push(矩阵[i][j]); 如果(i==matrix.length-1&&j==matrix[i].length-1){ 推(路径); 继续; } 如果(i+1
log(…getMaxPath([[1,1,1,1],[7,9,4,2000],[6,22,1,1],[1,1,1]])除了这里的
i
和j
之外,典型的自底向上动态程序将使用第三种状态。像[i][j][num_moves]
,空间需求增加了一倍。但是您的代码不允许每个(i,j)
组合同时出现多个移动计数状态。尝试使用dp[i][j][num\u moves]
来描述递归。这里是一个动态规划的实现,它处理每一行,探索在向下移动之前水平移动的单元格上可以达到的最大值
函数getMaxPath(arr){
var currentRow=[{
总数:0,,
路径:[]
}];
对于(变量i=0;inextRow[j+k].sum){
nextRow[j+k]={sum:sum,path:path.slice()};
}
}
}
}
currentRow=nextRow;
}
返回currentRow[currentRow.length-1];
}
console.log(getMaxPath([
[1, 1, 1, 1],
[7, 9, 4, 2000],
[6, 22, 1, 1],
[1, 1, 1, 1]
]));
只是一个问题,仍然需要检查数组中是否允许有真正相关的负数?是的负数被允许为什么不1 9 4 2000 1
?@NinaScholz请参见规则2但为什么1
?