题目:
这到题目呢,我们可以采用动态规划做。
从题目要求出发,我们只能够向下或者是向右,因此想要到达一些点有一个或者多个路径。因此我们可以把状态分解为2个子问题。
状态1.只有一条路走的地方(也就是第一行和第一列)
状态2.有多条路可以走的地方(剩余部分)
然后我们可以通过递归的方式来计算路径的和
第一行
for (int i = 1; i < width; i++)//从第一行第二个数开始进行加
obj[0][i] += obj[0][i - 1];
第一列
for (int i = 1; i < length; i++)//从第一列的第二个数开始加
obj[i][0] += obj[i-1][0];
剩余部分
for (int i = 1; i < length; i++)
for (int j = 1; j < width; j++)
obj[i][j] += min(obj[i - 1][j], obj[i][j - 1]);
整体代码
class Solution {
public:
int minPathSum(vector<vector<int> >& obj) {
if (obj.size() == 0) return 0;
int length = obj.size();//数组的长
int width = obj[0].size();//数组的宽
for (int i = 1; i < width; i++)
obj[0][i] += obj[0][i - 1];
for (int i = 1; i < length; i++)
obj[i][0] += obj[i-1][0];
for (int i = 1; i < length; i++)
for (int j = 1; j < width; j++)
obj[i][j] += min(obj[i - 1][j], obj[i][j - 1]);
return obj[length - 1][width - 1];
}
};
景sl