Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การหา Path ที่มีผลรวมน้อยที่สุดในเมทริกซ์ (เลือก 1 ต่อแถว ไม่ซ้ำคอลัมน์ติดกัน) ใน JavaScript

ปัญหา

เลือก 1 element ต่อ row ไม่ให้ติดคอลัมน์กันระหว่างแถวติดกัน หา path ที่ sum น้อยที่สุด

ตัวอย่าง

matrix = [[4,7,1],[2,8,3],[5,6,9]]
valid paths และ sums:
[4,8,9]=21, [4,8,6]=18, [4,3,6]=13, [4,3,5]=12
[7,2,6]=15, [7,2,9]=18, [7,3,6]=16, [7,3,5]=15
[1,2,6]=9, [1,2,9]=12, [1,8,9]=18, [1,8,5]=14
min = 9 (path [1,2,6])

ตัวอย่างโค้ด

const arr = [
  [4, 7, 1],
  [2, 8, 3],
  [5, 6, 9]
];

const minimumPathSum = (arr = []) => {
  let first = [0, null];
  let second = [0, null];
  for (let row = arr.length - 1; row >= 0; row--) {
    let curr1 = null;
    let curr2 = null;
    for (let column = 0; column < arr[row].length; column++) {
      let currentSum = arr[row][column];
      if (column !== first[1]) {
        currentSum += first[0];
      } else {
        currentSum += second[0];
      }
      if (curr1 === null || currentSum < curr1[0]) {
        curr2 = curr1;
        curr1 = [currentSum, column];
      } else if (curr2 === null || currentSum < curr2[0]) {
        curr2 = [currentSum, column];
      }
    }
    first = curr1;
    second = curr2;
  }
  return first[0];
};

console.log(minimumPathSum(arr));

ผลลัพธ์

9

คำอธิบาย

Bottom-up DP: เก็บ first (min sum) และ second (2nd min sum) ของ row ถัดไป พร้อม column

สำหรับแต่ละ column ใน row ปัจจุบัน: ห้ามใช้ column เดียวกับ first -> ใช้ second แทน

อัปเดต first/second ใหม่สำหรับ row นี้

Time: O(m*n), Space: O(1)