#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int findMaxBeauty(vector<vector<int>>& grid, int x, int y, int n,
vector<vector<bool>>& visited) {
// Base cases
if (x < 0 || x >= n || y < 0 || y >= n || visited[x][y])
return -1e9;
if (x == n-1 && y == n-1)
return grid[x][y];
// Mark current cell as visited
visited[x][y] = true;
// Try all possible moves: right, down, up
int maxPath = -1e9;
maxPath = max(maxPath, findMaxBeauty(grid, x, y+1, n, visited)); // right
maxPath = max(maxPath, findMaxBeauty(grid, x+1, y, n, visited)); // down
maxPath = max(maxPath, findMaxBeauty(grid, x-1, y, n, visited)); // up
// Unmark the cell (backtrack)
visited[x][y] = false;
// Return result
return grid[x][y] + maxPath;
}
int getMaximumBeauty(int n, vector<vector<int>>& grid) {
vector<vector<bool>> visited(n, vector<bool>(n, false));
return findMaxBeauty(grid, 0, 0, n, visited);
}
int main() {
int n = 3;
vector<vector<int>> grid = {
{1, 18, -10},
{-1, -18, -18},
{5, 2, 2}
};
cout << getMaximumBeauty(n, grid) << endl;
return 0;
}
ICAgICAgICAjaW5jbHVkZSA8aW9zdHJlYW0+CiAgICAgICAgI2luY2x1ZGUgPHZlY3Rvcj4KICAgICAgICAjaW5jbHVkZSA8YWxnb3JpdGhtPgogICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgCiAgICAgICAgaW50IGZpbmRNYXhCZWF1dHkodmVjdG9yPHZlY3RvcjxpbnQ+PiYgZ3JpZCwgaW50IHgsIGludCB5LCBpbnQgbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHZlY3Rvcjxib29sPj4mIHZpc2l0ZWQpIHsKICAgICAgICAgICAgLy8gQmFzZSBjYXNlcwogICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSBuIHx8IHkgPCAwIHx8IHkgPj0gbiB8fCB2aXNpdGVkW3hdW3ldKSAKICAgICAgICAgICAgICAgIHJldHVybiAtMWU5OwogICAgIAogICAgICAgICAgICBpZiAoeCA9PSBuLTEgJiYgeSA9PSBuLTEpIAogICAgICAgICAgICAgICAgcmV0dXJuIGdyaWRbeF1beV07CiAgICAgCiAgICAgICAgICAgIC8vIE1hcmsgY3VycmVudCBjZWxsIGFzIHZpc2l0ZWQKICAgICAgICAgICAgdmlzaXRlZFt4XVt5XSA9IHRydWU7CiAgICAgCiAgICAgICAgICAgIC8vIFRyeSBhbGwgcG9zc2libGUgbW92ZXM6IHJpZ2h0LCBkb3duLCB1cAogICAgICAgICAgICBpbnQgbWF4UGF0aCA9IC0xZTk7CiAgICAgICAgICAgIG1heFBhdGggPSBtYXgobWF4UGF0aCwgZmluZE1heEJlYXV0eShncmlkLCB4LCB5KzEsIG4sIHZpc2l0ZWQpKTsgIC8vIHJpZ2h0CiAgICAgICAgICAgIG1heFBhdGggPSBtYXgobWF4UGF0aCwgZmluZE1heEJlYXV0eShncmlkLCB4KzEsIHksIG4sIHZpc2l0ZWQpKTsgIC8vIGRvd24KICAgICAgICAgICAgbWF4UGF0aCA9IG1heChtYXhQYXRoLCBmaW5kTWF4QmVhdXR5KGdyaWQsIHgtMSwgeSwgbiwgdmlzaXRlZCkpOyAgLy8gdXAKICAgICAKICAgICAgICAgICAgLy8gVW5tYXJrIHRoZSBjZWxsIChiYWNrdHJhY2spCiAgICAgICAgICAgIHZpc2l0ZWRbeF1beV0gPSBmYWxzZTsKICAgICAKICAgICAgICAgICAgLy8gUmV0dXJuIHJlc3VsdAogICAgICAgICAgICByZXR1cm4gZ3JpZFt4XVt5XSArIG1heFBhdGg7CiAgICAgICAgfQogICAgIAogICAgICAgIGludCBnZXRNYXhpbXVtQmVhdXR5KGludCBuLCB2ZWN0b3I8dmVjdG9yPGludD4+JiBncmlkKSB7CiAgICAgICAgICAgIHZlY3Rvcjx2ZWN0b3I8Ym9vbD4+IHZpc2l0ZWQobiwgdmVjdG9yPGJvb2w+KG4sIGZhbHNlKSk7CiAgICAgICAgICAgIHJldHVybiBmaW5kTWF4QmVhdXR5KGdyaWQsIDAsIDAsIG4sIHZpc2l0ZWQpOwogICAgICAgIH0KICAgICAKICAgICAgICBpbnQgbWFpbigpIHsKICAgICAgICAgICAgaW50IG4gPSAzOwoJCSAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGdyaWQgPSB7CgkJICAgICAgICB7MSwgMTgsIC0xMH0sCgkJICAgICAgICB7LTEsIC0xOCwgLTE4fSwKCQkgICAgICAgIHs1LCAyLCAyfQoJCSAgICB9OwogICAgIAogICAgICAgICAgICBjb3V0IDw8IGdldE1heGltdW1CZWF1dHkobiwgZ3JpZCkgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQ==