动态规划(dynamic programming)之:triangle(三角形最小路径和)

题目一:求解三角形自上而下路径的最小值

 (1)用分治方法来做,

class Solution{
public:
    int minimumTotal(vector<vector<int> >& triangle) {
        if(triangle.size() <= 0)
            return -1;
        int result = dfs(0, 0, triangle);
        return result;
    }

    int dfs(int x, int y, vector<vector<int> >& triangle){
        int n = triangle.size();
        if(x == n)
            return 0;
        return min(dfs(x+1, y, triangle), dfs(x+1, y+1, triangle)) + triangle[x][y];
    }
};

(2)用动态规划来做

难点在于找状态方程。发现从triangle[x][y]出发,那么路径只能是triangle[x][y]—>triangle[x+1][y]或者triangle[x][y]—>triangle[x+1][y+1]。以点(x,y)为参考,则可能的状态为:

1,从(x,y)出发走到最后一行的最短路径和

2,从(0,0)出发走到(x,y)的最短路径和。

如果选择1为状态,则状态方程为:f1(x,y) = min(f1(x+1, y), f1(x+1, y+1)) + triangle[x][y];(这是自顶向下)

如果选择2位状态,则状态方程为:f2(x,y) = min(f2(x-1, y), f2(x-1, y-1)) + triangle[x][y];(这是自底向上)

重点掌握一下自底向上方法:(代码里面会改变triangle。如果不能改变triangle,则应该另外开辟一个数组,然后把triangle的值复制过去,对triangle进行操作);

class Solution {
public:
    //这是自底向上方法
    int minimumTotal(vector<vector<int> > &triangle) {
        if(triangle.empty())
            return -1;
        int n = triangle.size();
        for(int i = n-2; i >= 0; --i){
            for(int j = 0; j < i+1; ++j)
                triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]);
        }
        return triangle[0][0];
    }
};

猜你喜欢

转载自blog.csdn.net/ypshowm/article/details/89340536