ในปัญหานี้ เราได้ตารางสี่เหลี่ยมขนาด 2 x n งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมสูงสุดในกริด 2 x n เพื่อไม่ให้มีองค์ประกอบสองรายการอยู่ติดกันใน C ++
คำอธิบายปัญหา
ในการหาผลรวมสูงสุด เราไม่สามารถเลือกองค์ประกอบที่อยู่ติดกับองค์ประกอบปัจจุบัน ในแนวตั้ง แนวนอน หรือแนวทแยง
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
rectGrid[2][] =389 411
ผลลัพธ์
13
คำอธิบาย
ผลรวมที่เป็นไปได้ทั้งหมดคือ
หากเราเริ่มจาก rectGrid[0][0] เช่น 3 เราก็เพิ่มได้เพียง 9 หรือ 1 ค่าสูงสุดคือ 12
หากเราเริ่มจาก rectGrid[1][0] เช่น 4 เราก็บวกได้เพียง 9 หรือ 1 ค่า maxSum คือ 13
หากเราเริ่มจาก rectGrid[0][1] เช่น 8 เราไม่สามารถเพิ่มองค์ประกอบใด ๆ ได้ ผลรวมสูงสุดคือ 8
หากเราเริ่มจาก rectGrid[1][1] เช่น 1 เราไม่สามารถเพิ่มองค์ประกอบใดๆ ได้ ผลรวมสูงสุดคือ 1
หากเราเริ่มจาก rectGrid[0][2] เช่น 9 เราก็บวกได้เพียง 3 หรือ 4 ค่าสูงสุดคือ 13
หากเราเริ่มจาก rectGrid[1][2] เช่น 1 เราก็บวกได้ 3 หรือ 4 เท่านั้น ผลรวมสูงสุดคือ 5
ยอดรวมสูงสุดคือ 13
แนวทางการแก้ปัญหา
ปัญหาคล้ายกับผลรวมสูงสุดที่ไม่มีองค์ประกอบสองอย่างที่อยู่ติดกันที่เราได้เห็นในโพสต์ที่แล้ว ความแตกต่างคืออาร์เรย์ที่เป็น 2D ที่นี่และเงื่อนไขสำหรับองค์ประกอบที่อยู่ติดกัน ดังนั้น เราจะพิจารณาองค์ประกอบสูงสุดโดยใช้เงื่อนไขสำหรับทั้งแถวและคอลัมน์ เนื่องจากแต่ละคอลัมน์มีสองแถว เราจะพิจารณาองค์ประกอบทางเลือกให้มากที่สุด
ตัวอย่าง
โปรแกรมแสดงการทำงานของโซลูชัน
#include<iostream>
using namespace std;
int findMax(int a, int b){
if(a > b)
return a;
return b;
}
int calcMaxSum(int rectGrid[2][20], int N){
int currectSum = 0;
int nextSum = 0;
int altSum;
for (int i = 0; i<N; i++ ){
altSum = findMax(nextSum, currectSum);
currectSum = nextSum + findMax(rectGrid[0][i], rectGrid[1][i]);
nextSum = altSum;
}
int maxSum = findMax(nextSum, currectSum);
return maxSum;
}
int main(){
int rectGrid[2][20] = {{3, 8, 9, 5},
{4, 1, 2, 7}};
int N = 4;
cout<<"The maximum sum in a 2 x "<<N<<" grid such that no two elements are adjacent is "<<calcMaxSum(rectGrid, N);
return 0;
} ผลลัพธ์
The maximum sum in a 2 x 4 grid such that no two elements are adjacent is 15