ในปัญหานี้ เราได้รับตัวเลขที่อยู่ในรูปสามเหลี่ยม งานของเราคือสร้างโปรแกรมที่จะหาผลรวมเส้นทางสูงสุดในรูปสามเหลี่ยม
องค์ประกอบจะถูกจัดเรียงโดยเริ่มจากแถวที่ 1 โดยมีองค์ประกอบ 1 รายการ จากนั้นจึงจัดเรียงองค์ประกอบในแถวถัดไปโดยมีจำนวนองค์ประกอบเพิ่มขึ้นจนมีองค์ประกอบอยู่ในแถวที่ n
ดังนั้นโปรแกรมจะค้นหาเส้นทางที่จะให้ผลรวมสูงสุดขององค์ประกอบในรูปสามเหลี่ยม เราจึงต้องหาเส้นทางที่จะให้ผลรวมสูงสุด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน −
ป้อนข้อมูล −
1 5 6 8 2 9
ผลผลิต − 16
คำอธิบาย −
เส้นทางจากด้านบนจะคืนค่าผลรวมสูงสุด − 9+6+1 =16
เพื่อแก้ปัญหานี้ เราจะใช้โปรแกรมไดนามิกที่จะใช้วิธีจากล่างขึ้นบน
สำหรับสิ่งนี้ อันดับแรก ให้เลื่อนตัวเลขทั้งหมดของสามเหลี่ยมไปทางซ้ายก่อน แล้วบวก 0 ต่อท้าย สิ่งนี้จะทำให้สามเหลี่ยมดูเหมือนเมทริกซ์ที่คล้ายกับที่เราเห็นในปัญหาเส้นทางต้นทุนขั้นต่ำ หลังจากนี้ เราจะเริ่มจากด้านล่าง และสำหรับแต่ละองค์ประกอบ เราจะตรวจสอบเส้นทางที่เป็นไปได้ทั้งหมด และเลือกเส้นทางที่ให้ผลรวมสูงสุดที่เป็นไปได้จนถึงองค์ประกอบนั้น และข้ามไปด้านบนในลักษณะเดียวกันเพื่อหาผลรวมสูงสุดของเส้นทางในรูปสามเหลี่ยม
ตัวอย่าง
โปรแกรมหาผลรวมเส้นทางสูงสุดในรูปสามเหลี่ยม −
#include<iostream>
using namespace std;
#define N 3
int findMaxPathSumTriangle(int mat[][N], int m, int n){
for (int i=m-1; i>=0; i--){
for (int j=0; j<=i; j++){
if (mat[i+1][j] > mat[i+1][j+1])
mat[i][j] += mat[i+1][j];
else
mat[i][j] += mat[i+1][j+1];
}
}
return mat[0][0];
}
int main() {
int triangle[N][N] = {
{1, 0, 0},
{5, 6, 0},
{8, 2, 9} };
cout<<"The maximum path sum in triangle is "<<findMaxPathSumTriangle(triangle, 2, 2);
return 0;
} ผลลัพธ์
The maximum path sum in triangle is 16