Bootstrap

三角数组最小路径和问题

题目:

给出一个三角形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]即可。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;