首页 > 其他 > 详细

第三章上机实践

时间:2019-10-20 19:58:05      阅读:57      评论:0      收藏:0      [点我收藏+]

问题描述:
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。

算法描述: 这是一道很明显的动态规划问题。面对动态规划问题,我们必须找到递归方程
状态转移方程为dp[i][j] = a[i][j](i==n时) //我们用dp[i][j] 来存储从 第i行第j列的数字到底边的最大路径和 那么很显然 当要求位置就在最后一行,那肯定是他本身
其他情况时:dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+a[i][j];//容易想出 ,先比较左下右下的路径大小,再加上前一个数值

int dynamic_search(int i, int j){
if(i == n){
store[i][j] = arr[i][j];
return store[i][j];)
}
if(store[i][j] != -1){
return store[i][j]; }
else
{
int A = dynamic_search(i+1,j);
int B = dynamic_search(i+1,j+1);
store[i][j] = max(A,B) + arr[i][j];
return store[i][j];
}

时间复杂度分析O(n2) 用store【i】【j】保存值,下一次调用避免重复计算 注意到三角形的元素和为等差数列和 n(n + 1)/2 ;故为O(n2)

反思总结: 当遇到 寻找最优子结构较难的题目时,比如第三题的编辑距离,很难顺利写出递归方程,根本原因是除了看书本之外,很缺乏实战题目的训练,造成“眼高手低”的后果,所以还是需要自己多找题目训练,知道真正运用这个算法达到纯熟的效果

第三章上机实践

原文:https://www.cnblogs.com/orcking/p/11708257.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!