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

หาเส้นทางยาวที่สุดในแมทริกซ์ภายใต้เงื่อนไขที่กำหนดใน C++

สมมติว่ามีแมทริกซ์สี่เหลี่ยมจัตุรัสขนาด n มีองค์ประกอบที่แตกต่างกันทั้งหมด เราต้องหาความยาวเส้นทางสูงสุด ซึ่งทุกเซลล์ตามเส้นทางเรียงเพิ่มขึ้นด้วยความต่าง 1 จากเซลล์หนึ่งสามารถเคลื่อนที่ได้ 4 ทิศทาง: ซ้าย, ขวา, บน, ล่าง ดังนั้นถ้าแมทริกซ์เป็นแบบด้านล่าง:

129
538
467

ผลลัพธ์จะเป็น 4 เส้นทางยาวที่สุดคือ 6→7→8→9

เพื่อแก้ปัญหานี้ เราจะทำตามแนวคิดนี้ เราจะคำนวณเส้นทางยาวที่สุดเริ่มจากทุกเซลล์ เมื่อเราได้เส้นทางยาวที่สุดสำหรับทุกเซลล์แล้ว เราจะคืนค่าสูงสุดของเส้นทางยาวที่สุดทั้งหมด

การสังเกตสำคัญหนึ่งในแนวทางนี้คือมีปัญหาย่อยที่ทับซ้อนกันมาก ดังนั้นปัญหานี้สามารถแก้ได้ด้วย Dynamic Programming ที่นี่เราจะใช้ตารางค้นหา dp[][] เพื่อตรวจสอบว่าปัญหาถูกแก้แล้วหรือยัง

ตัวอย่าง

#include <iostream> 
#define n 3 
using namespace std; 

int getLongestPathLengthUtil(int i, int j, int matrix[n][n], int table[n][n]) {
    if (i < 0 || i >= n || j < 0 || j >= n)
        return 0;
    if (table[i][j] != -1)
        return table[i][j];
    int x = INT_MIN, y = INT_MIN, z = INT_MIN, w = INT_MIN;
    if (j < n - 1 && ((matrix[i][j] + 1) == matrix[i][j + 1]))
        x = 1 + getLongestPathLengthUtil(i, j + 1, matrix, table);
    if (j > 0 && (matrix[i][j] + 1 == matrix[i][j - 1]))
        y = 1 + getLongestPathLengthUtil(i, j - 1, matrix, table);
    if (i > 0 && (matrix[i][j] + 1 == matrix[i - 1][j]))
        z = 1 + getLongestPathLengthUtil(i - 1, j, matrix, table);
    if (i < n - 1 && (matrix[i][j] + 1 == matrix[i + 1][j]))
        w = 1 + getLongestPathLengthUtil(i + 1, j, matrix, table);
    return table[i][j] = max(x, max(y, max(z, max(w, 1))));
}

int getLongestPathLength(int matrix[n][n]) {
    int result = 1;
    int table[n][n];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            table[i][j] = -1;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (table[i][j] == -1)
                getLongestPathLengthUtil(i, j, matrix, table);
            result = max(result, table[i][j]);
        }
    }
    return result;
}

int main() {
    int mat[n][n] = { { 1, 2, 9 }, { 5, 3, 8 }, { 4, 6, 7 } };
    cout << "Length of the longest path is " << getLongestPathLength(mat);
}

ผลลัพธ์

Length of the longest path is 4