สมมติว่าเรามีเมทริกซ์ 2 มิติ ที่แต่ละเซลล์ matrix[r, c] แสดงจำนวนเหรียญในเซลล์นั้น เมื่อเราหยิบเหรียญจาก matrix[r, c] เหรียญทั้งหมดในแถว (r-1) และ (r+1) จะหายไป รวมถึงเหรียญที่เซลล์ matrix[r, c+1] และ matrix[r, c-1] เราต้องหาจำนวนเหรียญสูงสุดที่เก็บได้
เช่น ถ้าอินพุตคือ:
| 2 | 8 | 7 | 6 |
| 10 | 10 | 4 | 2 |
| 5 | 9 | 2 | 3 |
ผลลัพธ์จะเป็น 26 เพราะเราสามารถเลือกเซลล์ที่มีเหรียญ 8, 6, 9 และ 3 รวมเป็น 26
ขั้นตอนการแก้ปัญหา
- กำหนดฟังก์ชัน
getmax(arr):prev_max := 0,curr_max := 0,res := 0- สำหรับแต่ละ
numในarr:temp := curr_maxcurr_max := num + prev_maxprev_max := max(temp, prev_max)res := max(res, curr_max)
- คืนค่า
res
- จากเมธอดหลัก:
- ถ้า
matrixว่าง คืนค่า0 m := จำนวนแถว,n := จำนวนคอลัมน์row_sum := อาร์เรย์ขนาด m เติม 0- สำหรับ
iในช่วง0ถึงm-1:row_sum[i] := getmax(matrix[i]) - คืนค่า
getmax(row_sum)
- ถ้า
ตัวอย่างการใช้งาน
def getmax(arr):
prev_max, curr_max = 0, 0
res = 0
for num in arr:
temp = curr_max
curr_max = num + prev_max
prev_max = max(temp, prev_max)
res = max(res, curr_max)
return res
def solve(matrix):
if not matrix:
return 0
m, n = len(matrix), len(matrix[0])
row_sum = [0 for _ in range(m)]
for i in range(m):
row_sum[i] = getmax(matrix[i])
return getmax(row_sum)
matrix = [
[2, 8, 7, 6],
[10, 10, 4, 2],
[5, 9, 2, 3]
]
print(solve(matrix))
อินพุต
[[2, 8, 7, 6], [10, 10, 4, 2], [5, 9, 2, 3]]
เอาต์พุต
26