给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
int minPathSum(vector<vector<int>>& grid) {
//用dfs写
int h = grid[0].size();
int z = grid.size();
return dfs(grid);
}
int dfs(vector<vector<int>>& grid)
{
int next[2][2] = { {0,1}, //向右走
{1,0} }; //向下走
};
/*
1. 不管怎样的路径从起点到终点都是相同的步数m+n-1
2. dfs需要四个参数
3. 只能向下或者向右所以没有回头路,貌似可以减少参数
1. 又有一个新思路,就是统计走的向下向右的步数,本质上和上面一样,但是好像简单一点。
2. 貌似可以偷偷懒,直接用全排列去解。
3. 啊哈哈哈哈哈哈哈
4. 遗憾的是超时了
*/
int minPathSum(vector<vector<int>>& grid) {
const int h = grid[0].size();
const int z = grid.size();
int minsum = INT_MAX;
int sum = 0;
int* pl = new int[h + z - 2];
//貌似还跟字段序列有关系
for (int i = 0; i < z - 1; ++i)
{
//这里的赋值有问题,不是平均的
pl[i] = 0;
}
for (int i = 0; i < h-1; ++i)
{
//这里的赋值有问题,不是平均的
pl[z-1+i] = 1;
}
do {
/*for (int i = 0; i < h + z - 2; ++i)
std::cout << pl[i];
std::cout << endl;*/
int xpos, ypos;
xpos = ypos = 0;
sum = grid[0][0];
for (int i = 0; i < h + z - 2; ++i)
{
if (pl[i] == 0)
{
xpos++;
sum += grid[xpos][ypos];
}
else
{
ypos++;
sum += grid[xpos][ypos];
}
}
if (sum < minsum)
minsum = sum;
} while (next_permutation(pl, pl + h + z - 2));
return minsum;
}
官方:https://leetcode-cn.com/problems/minimum-path-sum/solution/zui-xiao-lu-jing-he-by-leetcode/
/*
这个是评论区的一个老哥的,感觉不错
*/
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int n = grid.size();
if(n==0)
return 0;
int m = grid[0].size();
if(m==0)
return 0;
//最上面的一行最左边的一列到达的权值是固定的
for(int i=1;i<m;i++)
{
grid[0][i] += grid[0][i-1];
}
for(int i=1;i<n;i++)
{
grid[i][0] += grid[i-1][0];
}
for(int i=1;i<n;i++)
{
for(int j=1;j<m;j++)
{
//从上边和右边选择一个权值最小的
grid[i][j]+=min(grid[i-1][j],grid[i][j-1]);
}
}
return grid[n-1][m-1];
}
};
作者:lunatic-kaleidoscope
链接:https://leetcode-cn.com/problems/two-sum/solution/c-dong-tai-gui-hua-4mschao-guo-99-by-lunatic-kalei/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。