数字三角形

问题:

        给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。

解题思路:

        该题是一道典型的动态规划的题目,到 i 行, j 列元素的最小的路径为 f[i][j],则f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + d[i][j],其中 d[i][j]为 i 行,j 列元素的值。

int minimumTotal(vector<vector<int> > &triangle) {
        // write your code here
        int result = 0;
        int row = triangle.size();
        if(row < 1)
            return result;
        int col = triangle[row - 1].size();
//创建辅助数组,完成动规        
        int **cache = new int*[row];
        for(int i = 0; i < row; i++){
            cache[i] = new int[col];
        }

        for(int i = 0; i < row; i++){
            for(int j = 0; j < col; j++){
                cache[i][j] = 0;
            }
        }
//填充辅助数组
        cache[0][0] = triangle[0][0];
        for(int i = 1; i < row; i++){
            for(int j = 0; j <= i; j++){
                if(j == 0){
                    cache[i][j] = cache[i - 1][j] + triangle[i][0];
                }else if(j == i){
                    
                    cache[i][j] = cache[i - 1][j - 1] + triangle[i][j];
                }else{
                    cache[i][j] = min(cache[i - 1][j - 1], cache[i - 1][j]) + triangle[i][j];
                }
            }
        }
//计算最小值
        int minsum = cache[row - 1][0];
        for(int j = 1; j < col; j++){
            if(cache[row - 1][j] < minsum){
                minsum = cache[row - 1][j];
            }
        }
        
        return minsum;
    }

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值