intcountPyramids(vector<vector<int>>& grid){ int n = grid.size(), m = grid[0].size(); int f[maxn][maxn] = {}; // f[i][j] 表示以 (i,j) 为顶点的最大高度 int ans = 0;
// ---------- 正金字塔(自下向上) ---------- for (int i = n; i >= 1; --i) { for (int j = 1; j <= m; ++j) { if (grid[i - 1][j - 1] == 0) continue; f[i][j] = min( f[i + 1][j - 1], min(f[i + 1][j], f[i + 1][j + 1]) ) + 1; ans += f[i][j] - 1; // 只统计高度 ≥ 2 } }
// 清空 DP 数组 memset(f, 0, sizeof(f));
// ---------- 倒金字塔(自上向下) ---------- for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (grid[i - 1][j - 1] == 0) continue; f[i][j] = min( f[i - 1][j - 1], min(f[i - 1][j], f[i - 1][j + 1]) ) + 1; ans += f[i][j] - 1; } }