กำหนดภารกิจคือค้นหาค่าจำนวนเต็มสูงสุดที่สามารถรับได้ขณะเดินทางในเส้นทางจากองค์ประกอบด้านซ้ายบนไปยังองค์ประกอบด้านล่างขวาของอาร์เรย์ไบนารีสแควร์ที่กำหนด นั่นคือ เริ่มจากดัชนี [0][0] ถึงดัชนี [n - 1][n - 1].
ในขณะที่ครอบคลุมเส้นทาง เราสามารถย้ายไปทางขวา ([i][j + 1]) หรือไปด้านล่างเท่านั้น ([i + 1][j])
ค่าจำนวนเต็มจะคำนวณโดยใช้บิตของเส้นทางที่ข้ามผ่าน
ตอนนี้มาทำความเข้าใจสิ่งที่เราต้องทำโดยใช้ตัวอย่าง -
อินพุต
m = {
{1, 1, 1, 1},
{0, 0, 1, 0},
{1, 0, 1, 1},
{0, 1, 1, 1}
} ผลลัพธ์
127
คำอธิบาย
เส้นทางที่เราใช้คือ [0, 0] →[0, 1] → [0, 2] → [1, 2] → [2, 2] → [3, 2] →[3, 3]พี>
ดังนั้นค่าทศนิยมจะกลายเป็น =1*(2 0 ) + 1*(2 1 ) + 1*(2 2 ) + 1*(2 3 ) + 1*(2 4 ) + 1*(2 5 ) + 1*(2 6 )
=1 + 2 + 4 + 8 + 16 + 32 + 64
=127
อินพุต
m = {
{1, 0, 1, 1},
{0, 0, 1, 0},
{1, 0, 0, 1},
{0, 1, 1, 1}
} ผลลัพธ์
109
แนวทางที่ใช้ในโปรแกรมด้านล่างดังนี้
-
ขั้นแรกให้กำหนดขนาดด้านของเมทริกซ์สี่เหลี่ยมจัตุรัสที่ด้านบนโดยใช้ #define
-
ในฟังก์ชัน main() สร้างอาร์เรย์ 2 มิติ int m[][4] เพื่อเก็บเมทริกซ์และเรียก Max(m, 0, 0, 0)
-
ในฟังก์ชัน max() ก่อนตรวจสอบว่า (i>=side || j>=side ) หากเป็นเช่นนั้น แสดงว่าเราอยู่นอกขอบเขตของเมทริกซ์และคืนค่าเป็น 0
-
สร้างตัวแปร int ans ใหม่และใส่ ans =max(Max(m, i, j+1, pw+1), Max(m, i+1, j, pw+1))
-
จากนั้นตรวจสอบว่า (m[i][j] ==1) ถ้าใช่ ให้คืนค่า pow(2, pw) + ans.
-
มิฉะนั้นเพียงส่งคืน ans
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
#define side 4
// pw is power of 2
int Max(int m[][side], int i, int j, int pw){
// Out of boundary
if (i >= side || j >= side )
return 0;
int ans = max(Max(m, i, j+1, pw+1), Max(m, i+1, j, pw+1));
if (m[i][j] == 1)
return pow(2, pw) + ans;
else
return ans;
}
//main function
int main(){
int m[][4] = {{1, 1, 1, 1},{0, 0, 1, 0},{1, 0, 1, 1},{0, 1, 1, 1}};
cout << Max(m, 0, 0, 0);
return 0;
} ผลลัพธ์
127