力扣:最小路径和

给定一个包含非负整数的 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值