Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态规划在二维数组中寻找带约束的最大路径_Javascript_Node.js_Arrays_Typescript_Algorithm - Fatal编程技术网

Javascript 动态规划在二维数组中寻找带约束的最大路径

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[

嗨,我在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[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+1sum(a)>sum(b)→a:b); }
    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