第三章上机实践

问题描述:
给定一个由 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(n²) 用store【i】【j】保存值,下一次调用避免重复计算 注意到三角形的元素和为等差数列和 n(n + 1)/2 ;故为O(n²)

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

posted @ 2019-10-20 17:32  FITZ陈思宇  阅读(145)  评论(0编辑  收藏  举报