题目一:求解三角形自上而下路径的最小值
(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];
}
};