【 每日一题】05 三角形最小路径和(DP4)

问题描述

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

示例 1:

输入:triangle = \[2,3,4,6,5,7,4,1,8,3]

输出:11

解释:如下面简图所示:

2

3 4

6 5 7

4 1 8 3

自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

解答

首先,既然是从上到下的路径,那么最后一个点必然是落在最后一行。

对于最后一行的某个位置的值,根据题意只能从上一行的某一个位置或者某两个位置之一转移而来。

同时,我们只关注前一位的累加值是多少,而不关心这个累加值结果是由什么路径而来的。

fij 代表到达某个点的最小路径和。

通过观察可以发现以下性质:

  1. 只要不是第一列(j!=0)位置上的数,都能通过「左上方」转移过来
  2. 只要不是每行最后一列(j!=i)位置上的数,都能通过「上方」转移而来

同时,这样的分析/转移过程,是可以推广并覆盖所有位置的。

至此,整个过程都没有问题,状态转移方程也能不重不漏的枚举到每一条路径。因此这个 DP 状态定义可用。

c 复制代码
int minimumTotal(int** triangle, int triangleSize, int* triangleColSize) {

    int ** f = (int **)malloc(sizeof(int *)* triangleSize);
    for(int i =0; i<triangleSize; i++){
        f[i] = (int *)malloc(sizeof(int) * triangleColSize[i]);
    }
    f[0][0] = triangle[0][0];
    

    int i, j;
    for(i=1; i<triangleSize; i++){
        for(j=0; j< triangleColSize[i]; j++){
            f[i][j] = 10000;
            //若不是j==0的位置,可以通过左上方转移
            if(j!=0){
                f[i][j] = fmin(f[i-1][j-1]+ triangle[i][j],  f[i][j]);
            }
            if(j!=(triangleColSize[i]-1)){
                f[i][j] = fmin(f[i-1][j]+ triangle[i][j],  f[i][j]);
            }
        }
    }
    
    int ans = 1e9;

    for(j =0 ;j<triangleColSize[triangleSize-1]; j++){
        ans = fmin(ans, f[triangleSize-1][j]);

    }

    return ans;
    
}
相关推荐
大侠归来1 小时前
C 语言 | 在函数中操作数组
c语言·c++·算法
怕浪猫6 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i7 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
Evand J8 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
weixin_307779139 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
朝朝辞暮i9 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
朝朝辞暮i10 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
Godspeed Zhao10 小时前
现代智能雷达技术14——算法(0)
线性代数·算法·雷达
可乐ea10 小时前
Agent 模型分级升级路由:用置信度阈值把贵模型省下来
人工智能·算法·机器学习·结构化输出·置信度路由·模型升级路由·大模型成本优化
Navigator_Z10 小时前
LeetCode //C - 1278. Palindrome Partitioning III
c语言·算法·leetcode