leetcode120

三角形最小路径
链接:三角形最小路径和

//设 d[i][j]为[0,0]到[i,j]的最短路径
/*由于每一步只能移动到下一行「相邻的节点」上,
因此要想走到位置 (i, j)(i,j),上一步就只能在位置 (i - 1, j - 1)(i−1,j−1) 或者位置 (i - 1, j)(i−1,j)。
我们在这两个位置中选择一个路径和较小的来进行转移,状态转移方程为:
f[i][j] =min(f[i-1][j-1], f[i-1][j]) + c[i][j]
*/
class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {      
       int[][] d=new int[triangle.size()+1][triangle.get(triangle.size()-1).size()+1];
        d[0][0]=triangle.get(0).get(0);         
        for(int i=1;i<triangle.size();i++){           
            for(int j=0;j<triangle.get(i).size();j++){  
            //三角形左边的状态转移方程
                if(j==0){
                    d[i][j]=d[i-1][j]+triangle.get(i).get(j);
                }
            //右边的
              else  if(j==triangle.get(i).size()-1){
                    d[i][j]=d[i-1][j-1]+triangle.get(i).get(j);
                }
              //中间部分
                else{
                    d[i][j]=Math.min(d[i-1][j],d[i-1][j-1])+triangle.get(i).get(j);
            }      
            }
        }
//找出最后一层最小的数即为最短路径
  int min = d[triangle.size() - 1][0];
        for (int i = 1; i < triangle.size(); ++i) {
            min = Math.min(min, d[triangle.size() - 1][i]);
        }
        return min;
    }
}
posted @ 2020-07-14 17:23  Kotonoha  阅读(156)  评论(1)    收藏  举报