贪心算法之最短路径
应用场景:路径分为若干层,每层之间有路径相连,求从起点到终点的最大/最小路径
核心代码:
//对于上图,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;//确定当前距离
}
}
}
思路:
对于路径中的某个点到终点的距离,等于 它到下一步可以走的点的距离+那一点到终点的距离 中最小的,因为下一步最小可能往后走的都很大,必须比较到该点距离与该点到终点距离的和。然后只要从终点开始,按此逻辑往前推至起点,即得到起点到终点的最小距离
注意:此题局部最优不代表全局最优,不能认为每一步选最小即得全局最小。