ได้รับลูกบาศก์ (cube) ที่สร้างจากอาร์เรย์ 3 มิติ cube[length][breadth][height] หา minimum sum path จากการเดินทางผ่านลูกบาศก์
ตัวอย่าง
Input: cube 3×3×3 = {{{2,4,1},{3,4,5},{9,8,7}}, {{5,3,2},{7,6,5},{8,7,6}}, {{3,2,1},{4,3,2},{5,4,3}}}
Output: Minimum Sum Path In 3-D Array are: 15
คำอธิบาย: เส้นทาง: 2 + 4 + 1 + 3 + 5 = 15
Input: cube 2×2×2 = {{{1,2},{7,8}}, {{3,5},{9,16}}}
Output: Minimum Sum Path In 3-D Array are: 24
คำอธิบาย: เส้นทาง: 1 + 2 + 5 + 16 = 24
อัลกอริทึม: Dynamic Programming 3 มิติ
- สร้างอาร์เรย์
arrขนาดเท่า cube, เริ่มarr[0][0][0] = cube[0][0][0] - เติมขอบ (edges) ก่อน:
arr[i][0][0] = arr[i-1][0][0] + cube[i][0][0](แกน length)arr[0][j][0] = arr[0][j-1][0] + cube[0][j][0](แกน breadth)arr[0][0][k] = arr[0][0][k-1] + cube[0][0][k](แกน height)
- เติมหน้า (faces) โดยใช้
Minimum(a,b,INT_MAX):arr[i][j][0] = min(arr[i-1][j][0], arr[i][j-1][0]) + cube[i][j][0]arr[i][0][k] = min(arr[i-1][0][k], arr[i][0][k-1]) + cube[i][0][k]arr[0][j][k] = min(arr[0][j][k-1], arr[0][j-1][k]) + cube[0][j][k]
- เติมภายใน (interior):
arr[i][j][k] = min(arr[i-1][j][k], arr[i][j-1][k], arr[i][j][k-1]) + cube[i][j][k] - คืนค่า
arr[length-1][breadth-1][height-1]
ฟังก์ชัน Minimum(a,b,c)
คืนค่าต่ำสุดของ 3 ตัว
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
#define length 3
#define breadth 3
#define height 3
int Minimum(int a, int b, int c) {
if (a < b) {
if (a < c) return a;
else return c;
} else if (b < c) return b;
else return c;
}
int Minimum_SubPath(int cube[][breadth][height]) {
int arr[length][breadth][height];
arr[0][0][0] = cube[0][0][0];
for (int i = 1; i < length; i++)
arr[i][0][0] = arr[i-1][0][0] + cube[i][0][0];
for (int j = 1; j < breadth; j++)
arr[0][j][0] = arr[0][j-1][0] + cube[0][j][0];
for (int k = 1; k < height; k++)
arr[0][0][k] = arr[0][0][k-1] + cube[0][0][k];
for (int i = 1; i < length; i++)
for (int j = 1; j < breadth; j++) {
int min_val = Minimum(arr[i-1][j][0], arr[i][j-1][0], INT_MAX);
arr[i][j][0] = min_val + cube[i][j][0];
}
for (int i = 1; i < length; i++)
for (int k = 1; k < height; k++) {
int min_val = Minimum(arr[i-1][0][k], arr[i][0][k-1], INT_MAX);
arr[i][0][k] = min_val + cube[i][0][k];
}
for (int k = 1; k < height; k++)
for (int j = 1; j < breadth; j++) {
int min_val = Minimum(arr[0][j][k-1], arr[0][j-1][k], INT_MAX);
arr[0][j][k] = min_val + cube[0][j][k];
}
for (int i = 1; i < length; i++)
for (int j = 1; j < breadth; j++)
for (int k = 1; k < height; k++) {
int min_val = Minimum(arr[i-1][j][k], arr[i][j-1][k], arr[i][j][k-1]);
arr[i][j][k] = min_val + cube[i][j][k];
}
return arr[length-1][breadth-1][height-1];
}
int main() {
int cube[length][breadth][height] = {
{{2,4,1},{3,4,5},{9,8,7}},
{{5,3,2},{7,6,5},{8,7,6}},
{{3,2,1},{4,3,2},{5,4,3}}
};
cout << "Minimum Sum Path In 3-D Array are: " << Minimum_SubPath(cube);
return 0;
}
ผลลัพธ์
Minimum Sum Path In 3-D Array are: 15