zoukankan      html  css  js  c++  java
  • LeetCode -- Tiangle

    Question:

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

    For example, given the following triangle

    [
         [2],
        [3,4],
       [6,5,7],
      [4,1,8,3]
    ]
    

    The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

    Analysis:

     给出一个三角形,找到从顶部到底部的最小路径。每次跨行移动时只能在相邻的元素间移动。示例如上。

    显然用DP,初始条件dp[0][0] = 顶部第一个元素。

    状态转移方程为:

    dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];

    当然要注意每行的最后一个元素和第一个元素,只有一个来源。

    最后再找出最后一行中最小的数值即可。

    本来是很简单的,但是由于是List取数时没有数组方便,因此调bug花了一些时间。。。

    代码如下:

    public class Solution {
        public int minimumTotal(List<List<Integer>> triangle) {
            if(triangle == null || triangle.size() == 0)
                return 0;
            if(triangle.size() == 1)
                return triangle.get(0).get(0);
            List<ArrayList<Integer>> dp = new ArrayList<ArrayList<Integer>>();
            ArrayList<Integer> dp0 = new ArrayList<Integer>();
            dp0.add(triangle.get(0).get(0));
            dp.add(dp0);
            int row = triangle.size();
            for(int i=1; i<row; i++ ) {
                ArrayList<Integer> dpi = dp.get(i-1);
                List<Integer> tempi = triangle.get(i);
                ArrayList<Integer> dpii = new ArrayList<Integer>();
                int col = tempi.size();
                for(int j=0; j<col; j++) {
                    if(j == 0) 
                        dpii.add(dpi.get(j)+tempi.get(0));
                    else if(j < dpi.size()){
                        dpii.add(Math.min(dpi.get(j-1), dpi.get(j)) + tempi.get(j));
                    }
                    else
                       dpii.add(dpi.get(j-1) + tempi.get(j));
                }
                dp.add(dpii);
            }
            int min = Integer.MAX_VALUE;
            dp0.clear();
            dp0 = dp.get(dp.size()-1);
            for(int i=0; i<dp0.size(); i++)
                if(min > dp0.get(i))
                    min = dp0.get(i);
            return min;
        }
    }
  • 相关阅读:
    lipo命令
    Eclipse安装ADT插件
    编译vo-aacenc遇到的问题
    双MIC安卓手机录音问题
    天天动听MP3解码器性能提升50%
    Sublime Text 2结合VS2010配置C C++编译
    讯飞语音语义接口测试
    讯飞语音接口注册
    iOS阶段学习第31天笔记(UINavigationBar介绍)
    iOS App上架AppStore 会遇到的坑
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/5380295.html
Copyright © 2011-2022 走看看