leetcode Triangle

 
  

分析:从最小面一层开始往上计算,设dp[i][j]是以第i层j个元素为起点的最小路径和,动态规划方程如下

 
  

dp[i][j] = value[i][j] + max{dp[i-1][j], dp[i-1][j+1]}

 
  

因为每一层之和它下一层的值有关,因此只需要一个一位数组保存下层的值,



public
int minmumTotalDP(ArrayList<ArrayList<Integer>> triangle){ int rows=triangle.size(); int[] dp=new int[rows]; //初始化值、、动态规划 for(int i=0;i<rows;i++){ dp[i]=triangle.get(rows-1).get(i); } for(int i=rows-2;i>=0;i--){ for(int j=0;j<=i;j++) dp[j]=Math.min(dp[j], dp[j+1])+triangle.get(i).get(j); } return dp[0]; }
 private int minValue ;
    public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
        if (triangle == null) {
            return 0;
        }
        minValue= Integer.MAX_VALUE;
        int n = triangle.size();
        Stack<Integer> stack = new Stack<Integer>();
        stack.push(0);
        getResult(triangle, stack, 1, n, triangle.get(0).get(0));
        return minValue;
    }
    private void getResult(ArrayList<ArrayList<Integer>> triangle,
            Stack<Integer> stack, int index, int n, int sum) {
        // TODO Auto-generated method stub
        if (index == n) {
            if (sum < minValue) {
                minValue = sum;
            }
            stack.pop();
            return;
        }
        int left = stack.peek();
        stack.push(left);
        getResult(triangle, stack, index + 1, n,
                sum + triangle.get(index).get(left));
        int right = stack.peek() + 1;
        stack.push(right);
        getResult(triangle, stack, index + 1, n,
                sum + triangle.get(index).get(right));
        stack.pop();
    }

 

转载于:https://www.cnblogs.com/csxf/p/3736505.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值