3
int f(vector<vector<int>> &grid, int i, int j, vector<vector<int>> &dp) {4
if (j < 0 || j >= grid[0].size() || !grid[i][j])6
else if (dp[i][j] != -1)9
if (i + 1 >= grid.size() || !grid[i + 1][j]) return dp[i][j] = 0;10
return dp[i][j] = 1 + min(f(grid, i + 1, j - 1, dp), f(grid, i + 1, j + 1, dp));12
int countPyramids(vector<vector<int>> &grid) {13
int res = 0, n = grid.size(), m = grid[0].size();14
vector<vector<int>> dp(n, vector<int>(m, -1));16
for (int i = 0; i < n - 1; i++)17
for (int j = 0; j < m - 1; j++)18
if (grid[i][j]) res += f(grid, i, j, dp);20
dp = vector<vector<int>>(n, vector<int>(m, -1));22
grid.end()); // flip the grid to consider upside-down pyramid24
for (int i = 0; i < n - 1; i++)25
for (int j = 0; j < m - 1; j++)26
if (grid[i][j]) res += f(grid, i, j, dp);