สมมติว่าเรามีจำนวนบวกสามกอง เราต้องหาผลรวมสูงสุดของสแต็คที่เป็นไปได้โดยอนุญาตให้นำองค์ประกอบด้านบนออกได้ สแต็คจะแสดงเป็นอาร์เรย์ ดัชนีแรกของอาร์เรย์แสดงถึงองค์ประกอบด้านบนของสแต็ก สมมติว่าองค์ประกอบสแต็กเป็นแบบ [3, 10], [4, 5] และ [2, 1] ผลลัพธ์จะเป็น 0 ผลรวมจะเท่ากันหลังจากลบองค์ประกอบทั้งหมดออกจากสแต็กทั้งหมดแล้วเท่านั้น
เพื่อแก้ปัญหานี้ เราจะทำตามแนวคิดนี้ แนวคิดคือการเปรียบเทียบผลรวมของแต่ละกอง หากไม่เท่ากัน ให้เอาองค์ประกอบบนสุดของกองที่มีผลรวมสูงสุดออก เราจะทำตามขั้นตอนเหล่านี้ -
-
ค้นหาผลรวมขององค์ประกอบทั้งหมดในแต่ละกอง
-
หากผลรวมของทั้งสามกองเท่ากัน นี่คือผลรวมสูงสุด
-
มิฉะนั้น ให้ลบองค์ประกอบด้านบนของสแต็กที่มีผลรวมสูงสุดในสามของสแต็ก จากนั้นทำซ้ำขั้นตอนที่ 1 และขั้นตอนที่ 2
ตัวอย่าง
#include <iostream> #include <algorithm> using namespace std; int maxStackSum(int stk1[], int stk2[], int stk3[], int size1, int size2, int size3) { int add1 = 0, add2 = 0, add3 = 0; for (int i=0; i < size1; i++) add1 += stk1[i]; for (int i=0; i < size2; i++) add2 += stk2[i]; for (int i=0; i < size3; i++) add3 += stk3[i]; int top1 =0, top2 = 0, top3 = 0; int ans = 0; while (true){ if (top1 == size1 || top2 == size2 || top3 == size3) return 0; if (add1 == add2 && add2 == add3) return add1; if (add1 >= add2 && add1 >= add3) add1 -= stk1[top1++]; else if (add2 >= add3 && add2 >= add3) add2 -= stk2[top2++]; else if (add3 >= add2 && add3 >= add1) add3 -= stk3[top3++]; } } int main() { int stack1[] = { 3, 2, 1, 1, 1 }; int stack2[] = { 4, 3, 2 }; int stack3[] = { 1, 1, 4, 1 }; int size1 = sizeof(stack1)/sizeof(stack1[0]); int size2 = sizeof(stack2)/sizeof(stack2[0]); int size3 = sizeof(stack3)/sizeof(stack3[0]); cout << "The maximum sum is: " << maxStackSum(stack1, stack2, stack3, size1, size2, size3); }
ผลลัพธ์
The maximum sum is: 5