• Triangle 解答


    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).

    Solution 1 -- DP

    We define dp[i] to be the smallest sum that must include nums[i]. For easier understanding, we maintain two lists to record dp[i] information. Time complexity O(n^2) and space cost O(n).

     1 public class Solution {
     2     public int minimumTotal(List<List<Integer>> triangle) {
     3         if (triangle == null || triangle.size() < 1)
     4             return 0;
     5         int size = triangle.size(), result = Integer.MAX_VALUE;
     6         List<Integer> currentList, currentDP, prevDP = new ArrayList<Integer>();
     7         for (int i = 0; i < size; i++) {
     8             currentList = triangle.get(i);
     9             currentDP = new ArrayList<Integer>();
    10             if (i == 0) {
    11                 currentDP.add(currentList.get(i));
    12             } else {
    13                 for (int j = 0; j <= i; j++) {
    14                     int tmpMin;
    15                     // Three Cases
    16                     if (j == 0)
    17                         tmpMin = currentList.get(j) + prevDP.get(0);
    18                     else if (j == i)
    19                         tmpMin = currentList.get(j) + prevDP.get(j - 1);
    20                     else
    21                         tmpMin = currentList.get(j) + Math.min(prevDP.get(j), prevDP.get(j - 1));
    22                     currentDP.add(tmpMin);
    23                 }
    24             }
    25             prevDP = currentDP;
    26         }
    27         // Select minimum number of dp[i]
    28         for (int tmp : prevDP)
    29             result = Math.min(tmp, result);
    30         return result;
    31     }
    32 }

    Solution 2 -- Bottom Up

    In this way, we need not to consider the three cases discussed above.

     1 public class Solution {
     2     public int minimumTotal(List<List<Integer>> triangle) {
     3         if (triangle == null || triangle.size() < 1)
     4             return 0;
     5         int size = triangle.size();
     6         int[] dp = new int[size];
     7         for (int i = 0; i < triangle.get(size - 1).size(); i++)
     8             dp[i] = triangle.get(size - 1).get(i);
     9         // Iterate from last second row
    10         for (int i = size - 2; i >= 0; i--) {
    11             List<Integer> tmpList = triangle.get(i);
    12             for (int j = 0; j < tmpList.size(); j++) {
    13                 dp[j] = tmpList.get(j) + Math.min(dp[j], dp[j + 1]);
    14             }
    15         }
    16         return dp[0];
    17     }
    18 }
  • 相关阅读:
    火车进出站(POJ1363)
    字符串反转,栈模拟(ZOJ1151)
    模拟网页的浏览Stack(POJ1028)
    Codeforces Round #347 (Div.2)_B. Rebus
    Codeforces Round #347 (Div.2)_A. Complicated GCD
    BFS模板
    广搜破解密码(HDU1195)
    DFS+BFS(POJ3083)
    砍树,POJ(2665)
    快速幂取模,POJ(1995)
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4825091.html
Copyright © 2020-2023  润新知