题目:
给出一个三角形vector<vector<int>> ve,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字。
使用动态规划算法。
题目解析:
题目的意思是从顶到底画出一条路径,路径在每一层水平方向的跳跃最多一步,这条路径的数字之和要是最小的。这到题在解的时候必须要从底开始,因为从上到下选择路径只能用贪吃算法,得不到最优解。使用动态规划算法需要先找到问题子结构。设dp[i][j]为自底向上计算得到的最小路径和的i行j列,应有公式:
dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + ve[i][j]
由此便可一步步计算到dp[0][0]。但是这样会造成空间的浪费,其实我们只需一个一维数组去保存dp的值,每一步迭代会更新dp的值。
于是可以得到:
dp[i] = min( dp[i], dp[i+1]) + ve[i]
计算到dp[0]即可。