ในปัญหานี้ เราได้รับเมทริกซ์ mat[][] ขนาด nXm งานของเราคือสร้างโปรแกรมเพื่อค้นหาเส้นทางผลรวมสูงสุดในเมทริกซ์จากบนลงล่างและด้านหลัง
คำอธิบายปัญหา − เราจำเป็นต้องหาผลรวมเส้นทางสูงสุดจากซ้ายบนไปล่างขวาแล้วย้อนกลับ
ท่าที่ถูกต้อง
From mat[0][0] to mat[n−1][m−1]: Right (mat[i][j] to mat[i][j+1]) and Down (mat[i][j] to mat[i+1][j]). From mat[n−1][m−1] to mat[0][0]: left (mat[i][j] to mat[i][j−1]) and up (mat[i][j] to mat[i−1][j]).
สิ่งสำคัญอย่างหนึ่งคือทั้งสองเส้นทางต้องไม่เหมือนกัน ควรมีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบที่แตกต่างกันในทั้งสองเส้นทาง
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
mat[][] = {
{1, 2, 4},
{3, 0, 1},
{5, −1, −1}
} ผลลัพธ์
15
คำอธิบาย
Path from mat[0][0] to mat[n−1][m−1]: 1 + 3 + 5 − 1 − 1 = 7 Path from mat[n−1][m−1] to mat[0][0]: + 1 + 4 + 2 + 1 = 8 Sum = 7 + 8 = 15
แนวทางการแก้ปัญหา
ในการแก้ปัญหา เราจำเป็นต้องค้นหาสองเส้นทาง (เส้นทางหนึ่งจาก mat[0][0] ถึง mat[n−1][m−1] และอีกเส้นทางจาก mat[n−1][m−1] ไปยัง mat[ 0][0] ). แต่สิ่งที่ดีกว่าที่ต้องทำคือหาผลรวมสำหรับเส้นทางที่แตกต่างกันสองทางจาก mat[0][0] ถึง mat[n− 1][m−1] สำหรับสิ่งนี้ เราจะเริ่มจาก mat[0][0] และค้นหาสองเส้นทางโดยค้นหาองค์ประกอบที่มีแนวโน้มมากที่สุดถัดไปจนกว่าจะถึงจุดสิ้นสุดของเส้นทาง แล้วส่งคืนผลรวมของทั้งสอง สิ่งหนึ่งที่เราต้องตรวจสอบคือค้นหาว่าเซลล์ไม่ได้อยู่บนเส้นทางทั้งสองหรือไม่ เนื่องจากต้องมีเส้นทางที่แตกต่างกันสองเส้นทาง
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <bits/stdc++.h>
using namespace std;
#define row 3
int CalcNodeDiff(int mat[][row], int path1x, int path1y, int path2x, int
path2y) {
if (path1x == path2x && path1y == path2y) {
return mat[path1x][path1y];
}
return mat[path1x][path1y] + mat[path2x][path2y];
}
int calcMaxPathSumOfMat(int mat[][row], int path1x, int path1y, int
path2x, int n) {
int pathSumDP[5][5][5];
memset(pathSumDP, −1, sizeof(pathSumDP));
int path2y = path1x + path1y − path2x;
int maxPathSum = −10000;
if (path1x >= n || path2x >= n || path1y >= row || path2y >= row)
return 0;
if (pathSumDP[path1x][path1y][path2x] != −1)
return pathSumDP[path1x][path1y][path2x];
maxPathSum = max(maxPathSum,
calcMaxPathSumOfMat(mat, path1x + 1, path1y, path2x + 1, n) +
CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
maxPathSum = max(maxPathSum,
calcMaxPathSumOfMat(mat, path1x, path1y + 1, path2x, n) +
CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
maxPathSum = max(maxPathSum,
calcMaxPathSumOfMat(mat, path1x, path1y + 1, path2x + 1, n) +
CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
maxPathSum = max(maxPathSum,
calcMaxPathSumOfMat(mat, path1x + 1, path1y, path2x, n) +
CalcNodeDiff(mat, path1x, path1y, path2x, path2y));
pathSumDP[path1x][path1y][path2x] = maxPathSum;
return maxPathSum;
}
int main() {
int n = 3;
int mat[n][row] = {
{ 1, 2, 4 },
{ 3, 0, 1 },
{ 5, −1, −1 }
};
cout<<"The maximum sum path in a matrix from top to bottom and back is "<<calcMaxPathSumOfMat(mat, 0, 0, 0, n);
return 0;
} ผลลัพธ์
The maximum sum path in a matrix from top to bottom and back is 15