Nhiệm vụ: tìm giá trị nguyên lớn nhất có thể đạt được khi đi từ góc trên trái [0][0] đến góc dưới phải [n-1][n-1] của ma trận vuông nhị phân. Chỉ được đi phải ([i][j+1]) hoặc xuống ([i+1][j]). Giá trị nguyên tính từ các bit trên đường đi.
Ví dụ 1
Đầu vào** –
m = {
{1, 1, 1, 1},
{0, 0, 1, 0},
{1, 0, 1, 1},
{0, 1, 1, 1}
}
Đầu ra** – 127
Giải thích** – Đường đi: [0,0]→[0,1]→[0,2]→[1,2]→[2,2]→[3,2]→[3,3]. Các bit = 1,1,1,1,1,1,1. Giá trị = Σ 2ⁱ (i=0..6) = 127.
Ví dụ 2
Đầu vào** –
m = {
{1, 0, 1, 1},
{0, 0, 1, 0},
{1, 0, 0, 1},
{0, 1, 1, 1}
}
Đầu ra** – 109
Phương pháp (Đệ quy)
- Đệ quy từ (0,0) với tham số
pw(lũy thừa 2). - Tại mỗi ô: nếu ngoài ma trận → trả 0.
- Đệ quy sang phải và xuống, lấy max.
- Nếu ô hiện tại = 1: trả
2^pw + max(phải, xuống); ngược lại trả max.
Ví dụ
#include<bits/stdc++.h>
using namespace std;
#define side 4
int Max(int m[][side], int i, int j, int pw) {
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;
}
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;
}
Đầu ra
127