【LeetCode120】Triangle[DP]

120. Triangle

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

题目的意思很明确,就是要求找出最短路径,类似于二叉树的最小路径,所以马上就想到了用递归的方法

分析:

设f(n)为当前路径总和最小值,a[i][j]为三角形, 0<n<a.length

当 n = 1时:

f(n) = a[0][0] (显然)

当 1<n<a.size时,

f(n) =Min{f(n-1) + a[n][j],f(n-1) + a[n][j+1]}, 0<j<a[n].length-1

当 n>=a.size时 ,

f(n) = a[n][j]

老规矩,用JAVA

Recursive version(超时版本):

    public int minimumTotal( List<List<Integer>> triangle ) {
        return goRec( triangle, 0, 0 );
    }

    private int goRec( List<List<Integer>> triangle, int index, int row ) {
        if( row == triangle.size() - 1 ) {
            return triangle.get( row ).get( index );
        }
        int nextRow = row + 1;
        return triangle.get( row ).get( index ) + Math.min( goRec( triangle, index, nextRow ), goRec( triangle, ++index, nextRow ) );
    }

一提上去,果不其然,最后的test case过不了,会超时(TLE)。

无奈,只能改用动态规划(Dp)的方法来做。

用dp的方法是用一个n*n的矩阵来表示当前值。

根据上面的分析,很容易就能写出状态转移方程:

dp[i][j]= Min{dp[i-1][j] + triangle[i][j],dp[i-1][j] + triangle[i][j+1]}

Ps.注意边界值,即 j==0和 j==i时的情况。

Ac Code:

    public int minimumTotal( List<List<Integer>> triangle ) {
        int[][] dp = new int[ triangle.size() ][ triangle.size() ];
        dp[ 0 ][ 0 ] = triangle.get( 0 ).get( 0 );

        for( int i = 1; i < triangle.size(); i++ ) {
            List<Integer> tempList = triangle.get( i );
            for( int j = 0; j < i + 1; j++ ) {
                if( j == 0 ) {
                    dp[ i ][ j ] = dp[ i - 1 ][ j ] + tempList.get( j );
                } else if( j == i ) {
                    dp[ i ][ j ] = dp[ i - 1 ][ j - 1 ] + tempList.get( j );
                } else {
                    dp[ i ][ j ] = Math.min( dp[ i - 1 ][ j ] + tempList.get( j ), dp[ i - 1 ][ j - 1 ] + tempList.get( j ) );
                }
            }
        }

        int result = Integer.MAX_VALUE;
        int length = dp[ triangle.size() - 1 ].length;
        for( int i = 0; i < length; i++ ) {
            int temp = dp[ length - 1 ][ i ];
            if( temp < result ) {
                result = temp;
            }
        }
        return result;
    }

暂时没有想到更好的方法,我觉得应该可以优化,毕竟题目中存在Bounus point(空间复杂度是O(n)),我的做法明显是复杂度似乎是O(n)?

时间: 2024-11-04 19:46:19

【LeetCode120】Triangle[DP]的相关文章

【LeetCode】Triangle

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

【转】 Android dp和px之间进行转换

在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致.但是在代码中,如何处理呢?很多控件的方法中都只提供了设置px的方法,例如setPadding,并没有提供设置dp的方法.这个时候,如果需要设置dp的话,就要将dp转换成px了. 以下是一个应用类,方便进行px和dp之间的转换. import android.content.Context; public class DensityUtil { /**

NOJ 1111 保险箱的密码 【大红】 [区间dp]

传送门 保险箱的密码 [大红] 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 118            测试通过 : 3  题目描述 最近sed同学设计了一套保险箱密码锁,密码锁上有依次排好的0.1数字键,保险箱密码是由0和1组成的数字串.开启这个保险箱需要正确的密码,还需要将密码锁上数字键设定为对应的0或1,而这个过程需要特定的技巧:每次变换的工作:将密码锁上连续的0.1数字串用同样数目的全0或全1数

【LeetCode】Triangle 解题报告

[题目] 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 

【LeetCode】Triangle 解决报告

[称号] 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 

【专题】区间dp

1.[nyoj737]石子合并 传送门:点击打开链接 描述    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. 输入 有多组测试数据,输入到文件结束.每组测试数据第一行有一个整数n,表示有n堆石子.接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 输出 输出总代价的最小值,占单独的一行 样例输入 3 1 2 3

【LeetCode】triangle求最小和路径

今天闲来无事,做了三道leetcode水题,怒更两发博客,也挺不错.今天更新的两篇都是dp解法的简单题. 题目要求如下. 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],

【UVALive4685-Succession】树形DP

http://acm.hust.edu.cn/vjudge/problem/14338 题意:给定一棵树,每个点有一个值,让你选择k个点,并且这k个点是连在一起的(从任意一个点出发,可以遍历完所有选择的点 并且 不经过没有被选择的点),让这k个点的价值总和最大,纹方案数(Mod1000000007). 题解:设d[x][k]为必须选择x,以x为根的子树中共选择了k个节点,价值总和最大是多少. f[x][k]为d[x][k]对应的方案数是多少. 对于x,我们把x的孩子son不断地并到f[x]中.

【学习】序列DP

做了也有一段时间的序列DP了,发现了一些规律 如果有两个字符串,一般来说,f[i][j]表示S串到第i位,T串到第j位. 如果lenS==lenT,可能可以优化到1维. 如果只有1个序列的话,一般来说f[i]表示到第i位的状态. 有一些特殊的东西:最长回文子序列是把原串倒过来然后做一遍最长公共子序列,检查一下奇偶性×2即可. 然后呢还有最长回文子串有个manacher算法来着改天要去看看. BZOJ上的题好像只做了一道呀= =好像是带计数的数列DP呀,用容斥原理搞一下就好咯. 感觉自己还是很弱还