DP:三角形的最小路径和

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
 
思路:自底向上的动态规划,从三角形倒数第二行开始看, triangle[i][j] 一定会到达  triangle[i+1][j] 或者  triangle[i+1][j+1] 得出状态转移方程,
所以当前状态最小和就是 triangle[i+1][j] 与 triangle[i+1][j+1] 的最小值加上 triangle[i][j] 
得出状态转移方程: triangle[i][j] = min(triangle[i+1][j],triangle[i+1][j+1]) + triangle[i][j]  
简单来说:数组中元素的变化
2
3,4
6,5,7
4,1,8,3
对6来说肯定选4和1的最小值与它相加,对5来说肯定选1与8的最小值与它相加,对7来说肯定选8与3的最小值与它相加所以变成
2
3,4
7,6,10
4,1,8,3
同理:
2
9,10
7,6,10
4,1,8,3
2与9与10的最小值相加为11,即返回11.  可以得出的遍历行和列,所以算法复杂度O(N^2);
复制代码
 1 #define min(a,b) (a < b ? a : b)
 2 
 3 int minimumTotal(int** triangle, int triangleSize, int* triangleColSize)
 4 {
 5    int i,j;
 6    if(triangle == NULL)
 7    {
 8        return 0;
 9    }
10 
11    for(i = triangleSize-2;i>=0; i--)
12    {
13        for(j = 0; j < triangleColSize[i]; j++)
14        {
15            triangle[i][j] = min(triangle[i+1][j],triangle[i+1][j+1]) + triangle[i][j];
16        }
17    }
18    return triangle[0][0];
19 }
复制代码

 

 
 
 
 
posted @   Xxaj5  阅读(127)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示