Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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 项目Euler#345:具有唯一路径的最大和矩阵_Javascript_Matrix_Dynamic_Sum - Fatal编程技术网

Javascript 项目Euler#345:具有唯一路径的最大和矩阵

Javascript 项目Euler#345:具有唯一路径的最大和矩阵,javascript,matrix,dynamic,sum,Javascript,Matrix,Dynamic,Sum,基点:我正在寻找关于如何使用动态规划来解决以下问题的帮助。我目前的解决方案有点失控 问题:从NxN矩阵中查找最大和,该矩阵只包含每个子数组中的一个元素,必须从每个列中选择元素。 例如: [[1,2], [3,4]] 最高金额为5英镑。所以矩阵[0][0]+矩阵[1][1]或矩阵[0][1]+矩阵[1][0] 应该能够运行n=0…30 我以次优时间复杂度编写了以下函数: var perm = function (values, currentCombo = [], allPerm = []) {

基点:我正在寻找关于如何使用动态规划来解决以下问题的帮助。我目前的解决方案有点失控

问题:从NxN矩阵中查找最大和,该矩阵只包含每个子数组中的一个元素,必须从每个列中选择元素。 例如: [[1,2], [3,4]] 最高金额为5英镑。所以矩阵[0][0]+矩阵[1][1]或矩阵[0][1]+矩阵[1][0]

应该能够运行n=0…30

我以次优时间复杂度编写了以下函数:

var perm = function (values, currentCombo = [], allPerm  = []) {
  if (values.length < 1) {
    allPerm.push(currentCombo);
    return allPerm;
  }
  for (var i = 0; i < values.length; i++) {
    var copy = values.slice(0);
    var value = copy.splice(i, 1);
    perm(copy, currentCombo.concat(value), allPerm);
  }
  return allPerm;
};

var maxSumMatrix = function(matrix){
  var n = matrix.length;
  var options = [];
  for(let i = 0; i < n; i++){
      let row = new Array(n).fill(0);
      row[i] = 1;
      options.push(row);
  }
  var paths = perm(options);
  var accumMax = null;
  for(var i = 0; i < paths.length; i++){
      var sum = null;
      for(var j = 0; j < paths[i].length; j++){
        for(var k = 0; k < paths[i][j].length; k++){
          sum += paths[i][j][k] * matrix[j][k];
        }
        if(accumMax === null || accumMax < sum){
          accumMax = sum;
        }
      }
  }
  return accumMax;
}
var perm=function(值,currentCombo=[],allPerm=[]){
如果(值。长度<1){
allPerm.push(当前组合);
返回allPerm;
}
对于(变量i=0;i
所以“置换”找到所有的0,1置换解,然后我将每个可能的解乘以输入矩阵,找到最大答案

谢谢大家!

编辑

对于下面的矩阵:[[1,2,4],[2,-1,0],[2,20,6]; 最大的数目是26。
From:matrix[0][2]+matrix[1][0]+matrix[2][1]

以下是我的方法:

const remove = (start, count, list) => {
  var result = list.slice(0);
  result.splice(start, count);
  return result;
}

const removeRow = (row, matrix) => remove(row, 1, matrix);
const removeCol = (col, matrix) => matrix.map(row => remove(col, 1, row)); 
const max = (xs) => Math.max.apply(null, xs);

const maxSum = (matrix) => matrix.length === 1 
  ? max(matrix[0]) 
  : max(matrix[0].map((col, idx) => col + maxSum(removeCol(idx, removeRow(0, matrix)))));

maxSum([
  [1, 2,  4], 
  [2, -1, 0], 
  [2, 20, 6]
]); //=> 26
如果使用非常大的矩阵,这将遇到递归深度问题

这就产生了各种各样的简化假设。它们归结为输入是数字的平方矩阵的要求。如果不是这样,坏事可能会发生


如果你感兴趣的话,我会先这么做,因为我就是这么想的。(我是作者之一。)然后我把它翻译成上面的

在拉姆达,它可能看起来像这样:

const removeRow = curry((row, matrix) => remove(row, 1, matrix));
const removeCol = curry((col, matrix) => map(remove(col, 1), matrix)); 
const highest = (xs) => Math.max.apply(null, xs);

const maxSum = (matrix) => matrix.length == 1 
  ? highest(matrix[0]) 
  : highest(addIndex(map)((col, idx) => col + maxSum(removeCol(idx, removeRow(0, matrix))), matrix[0]));

…您可以在

上看到,我理解正确吗?您有一个数组数组,您希望通过从每个子数组中选择最大值并将其相加来找到最大和?e、 我认为我的理解不正确。你是如何从你的例子中得到5分的?将普通数学与代码分开显示。我刚刚添加到原始问题中。很抱歉。答案5来自矩阵[0][1]+矩阵[1][0]。@anoeto-如果矩阵是
nxn
,你能举一个更复杂的例子吗?例如,3x3或4x4来说明如何计算值。当然,一秒钟。