[Leetcode]120.三角形路径最小和
---恢复内容开始---
简单的动态规划题,使用了二维dp数组就能很好的表示。
由于有边界的问题,所以这个dp数组为 dp[n+1][n+1]。
dp[i][j]意思是终点为(i-1,j-1)点的路径最小和。
我们需要把这个三角形变成方阵来看,先看看样例:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
变成方阵之后就变成了
[
[2, INT_MAX,INT_MAX, INT_MAX],
[3, 4,INT_MAX, INT_MAX],
[6, 5, 7, INT_MAX],
[4, 1, 8, 3],
]
有上面方阵很容易得出这个状态转移方程为
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i-1][j-1];
为了避开数组越界(人i=0或j=0)的问题,我们的dp数组容量比triange大一:即triangle[i][j]->dp[i+1][j+1]
class Solution { public: int minimumTotal(vector<vector<int>> &triangle) { size_t n = triangle.size(); int dp[n + 1][n + 1]; memset(dp, 0x3f, sizeof(dp)); int ans = INT_MAX; dp[1][1] = triangle[0][0]; for (size_t i = 2; i <= n; i++) { for (size_t j = 1; j <= triangle[i - 1].size(); j++) { dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i-1][j-1]; } } for (size_t i = 1; i <= n; i++) { ans = min(ans, dp[n][i]); } return ans; } };
或者根本不用再建立一个新的dp数组,而是直接在triangle数组上进行操作。比如
class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { if(triangle.size() == 0 || triangle[0].size() == 0) return 0; int n = triangle.size(); for(int i = n - 2; i >= 0; i--) for(int j = 0; j < i + 1; j++) triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]); return triangle[0][0]; } };
这一题的升级版问题可以看我的另一篇随笔: 下降路径最小和
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略