每日一结

576. 出界的路径数

采用剪枝和记忆搜索的方法。
当加上dir之后的坐标值,越界时,说明找到了出路,此时return 1;
当没有移动步数的时候,直接return 0;
当当前的坐标值加/减移动步数却不能越界时,return 0;
当当前位置有记忆时,直接return 记忆值。【设置记忆数组初始值为-1】
之后:
int sum = 0;
for(int[] di : dir) {
int ni = i + di[0], nj = j + di[1];
sum = (sum + dsf(m, n, maxMove - 1, ni, nj, ans)) % mod;【注意sum + ,以及求余】
}
ans[i][j][maxMove] = sum;//记录
return sum;


1575. 统计所有可行路径

采用动态规划。
dp[n][fuel + 1],n表示【当前】的位置,fuel表示当前剩余油量。
初始化
for(int i = 0; i <= fuel; i++) {
ans[finish][i] = 1; //起点和重点重合,无论是否有油,都有一条路
}

    for(int cur = 0; cur <= fuel; cur++) {//在这个油量的情况下,各个位置都求
        for(int i = 0; i < n; i++) {     //任意两个点
            for(int j = 0; j < n; j++) {
                if(i != j) {
                    int need = Math.abs(locations[i] - locations[j]);
                    if(cur >= need) {
                        ans[i][cur] += ans[j][cur- need];
                        ans[i][cur] %= mod;
                    } 
                }
            }
        }
    }
    return ans[start][fuel];

1289. 下降路径最小和 II

重点是,再设置一层循环,求出上一层的最小值。


931. 下降路径最小和

从上层到下层,判断一下,左上和右上越界否即可。

posted on 2022-10-08 18:51  xtdnn  阅读(24)  评论(0)    收藏  举报

导航