lc3665
class Solution {
public:
int uniquePaths(vector<vector<int>>& grid) {
const int MOD = 1'000'000'007;
int m = grid.size(), n = grid[0].size();
vector memo(m, vector(n, array<int, 2>{-1, -1})); // -1 表示没有计算过
auto dfs = [&](this auto&& dfs, int i, int j, int k) -> int {
if (i < 0 || j < 0) { // 出界
return 0;
}
if (i == 0 && j == 0) { // 到达起点
return 1;
}
int& res = memo[i][j][k]; // 注意这里是引用
if (res != -1) { // 之前计算过
return res;
}
if (grid[i][j] == 0) { // 没有镜子,随便走
res = (dfs(i, j - 1, 0) + dfs(i - 1, j, 1)) % MOD;
} else if (k == 0) { // 从下边过来
res = dfs(i - 1, j, 1); // 反射到左边
} else { // 从右边过来
res = dfs(i, j - 1, 0); // 反射到上边
}
return res;
};
return dfs(m - 1, n - 1, 0); // 从终点出发
}
};
lc563
int dfs
ret += abs(leftSum - rightSum);
return node->val + leftSum + rightSum;
class Solution {
int ret = 0; // 存储最终坡度总和
public:
int findTilt(TreeNode* root) {
dfs(root);
return ret;
}
// 辅助函数:返回以 node 为根的子树的总节点和,并计算当前节点的坡度
int dfs(TreeNode* node) {
if (node == nullptr) return 0; // 空节点,子树和为 0
int leftSum = dfs(node->left); // 左子树和
int rightSum = dfs(node->right); // 右子树和
ret += abs(leftSum - rightSum);
return node->val + leftSum + rightSum;
}
};