全局最优解,贪心不可取,动态规划上(1289. 下降路径最小和 II)

贪心思想

class Solution {
    public int minFallingPathSum(int[][] grid) {
        int r = grid.length,c = grid[0].length;
        int ans = 0;
        int indx = 201;//此标记记录上一行最小值的列
        for(int i = 0; i < r; i++){
            int tmp = Integer.MAX_VALUE,tmpindx = 201;     
            for(int j = 0;j < c;j++){
                if(grid[i][j] < tmp && indx != j){
                    tmp = grid[i][j];
                    tmpindx = j;
                }
            }
            indx = tmpindx;
            ans += tmp;
        }
        return ans;
    }
}
/*
直接先遍历每一行,在每一行遍历最小值,同时记录此最小值所在的列,循环下去
这种是贪心思想,但是你得保证整体是最小的,
动态规划!
 */

动态规划

class Solution {
    public int minFallingPathSum(int[][] grid) {
        int n = grid.length;
        int[][]f = new int[n][n];
       //全部赋值最大值 
        for(int i = 0;i < n;i++){
            for(int j = 0;j < n; j++){
                f[i][j] = Integer.MAX_VALUE;
            }
        }
        //更新第一行的值
        for(int i = 0;i < n;i++){
            f[0][i] = grid[0][i];
        }
        //确定每一个点f[i][j]的值,搜索i-1行和的最小值加上当前位置grid[i][j]的值
        for(int i = 1;i < n;i++){
            for(int j = 0;j < n; j++){
                for(int k = 0;k < n;k++){
                    if(j == k)continue;
                    f[i][j] = Math.min(f[i][j] , f[i - 1][k] + grid[i][j]);
                }
            }
        }
        int ans = Integer.MAX_VALUE;
        for(int i = 0; i < n;i++){
            ans = Math.min(ans,f[n-1][i]);
        }
        return ans;
    }
}
/*
想要整体的和最小值 还有相邻数字不同列限制
f[i][j]到达(i,j)和的最小值
又忘了动态规划推导过程了,是确定当前位置的值,然后加上前面的最值
f[i][j] = Math.min(f[i][j] , f[i - 1][k] + grid[i][j]);



*/

你可能感兴趣的:(算法笔记,java)