最短路径问题(2048)

贪心算法之最短路径

应用场景:路径分为若干层,每层之间有路径相连,求从起点到终点的最大/最小路径

在这里插入图片描述
核心代码:

//对于上图,k为终点编号,a为路径矩阵,n为层数
//dp为该点到终点的最长/最短距离
//最终的dp[1][1]
void search(int k, int a[105][105],int n,int dp[105][105]) {
	int i, j, t;
	int x;
	dp[n][k] = a[n][k];//距离在点上故终点到终点的距离为终点的值
	for (i = n - 1; i >= 1; --i) {//从后往前遍历每层i
		for (j = 1; j <= i; ++j) {//遍历每层每个元素
			int t = 0;
			//判断走左边或右边
			t = a[i][j] + dp[i + 1][j] > a[i][j] + dp[i + 1][j + 1] ? a[i][j] + dp[i + 1][j] : a[i][j] + dp[i + 1][j + 1];
			dp[i][j] = t;//确定当前距离
		}

	}
}

思路:
对于路径中的某个点到终点的距离,等于 它到下一步可以走的点的距离+那一点到终点的距离 中最小的,因为下一步最小可能往后走的都很大,必须比较到该点距离与该点到终点距离的和。然后只要从终点开始,按此逻辑往前推至起点,即得到起点到终点的最小距离

注意:此题局部最优不代表全局最优,不能认为每一步选最小即得全局最小。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值