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

การหาเส้นทางที่ยาวที่สุดที่มีลำดับเพิ่มในเมทริกซ์ 2D ใน JavaScript

Increasing Sequence

ลำดับที่แต่ละ element >= element ก่อนหน้า

ปัญหา

หาความยาว longest increasing path ใน 2D matrix (เคลื่อนที่ 4 ทิศทาง)

ตัวอย่าง

matrix = [[4,5,6],[4,3,7],[3,3,2]]
longest path: 4->5->6->7 length = 4

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

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

const longestIncreasingPath = (arr = []) => {
  let longest = 0;
  let dp = Array(arr.length).fill(null).map(() =>
    Array(arr[0].length).fill(1)
  );
  const backtracking = (row, col) => {
    if (dp[row][col] != 1) return dp[row][col];
    let dRow = [1, 0, -1, 0];
    let dCol = [0, 1, 0, -1];
    for (let i = 0; i < dRow.length; i++) {
      let nR = row + dRow[i], nC = col + dCol[i];
      if (nR >= 0 && nR < arr.length && nC >= 0 && nC < arr[0].length && arr[nR][nC] > arr[row][col]) {
        dp[row][col] = Math.max(dp[row][col], 1 + backtracking(nR, nC));
      }
    }
    return dp[row][col];
  };
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[0].length; j++) {
      longest = Math.max(longest, backtracking(i, j));
    }
  }
  return longest;
};

console.log(longestIncreasingPath(arr));

ผลลัพธ์

4

คำอธิบาย

DFS + Memoization (DP): dp[row][col] = longest path เริ่มจาก (row,col)

คำนวณแบบ top-down: หากคำนวณแล้วคืนค่าทันที มิฉะนั้น recursive 4 ทิศทางหา neighbor ที่มากกว่า

Time: O(m*n) ทุก cell คำนวณได้สูงสุด 1 ครั้ง, Space: O(m*n)