例子:
数字三角形问题
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
从顶部向下走,每次只能走下面或者右下,走完全程,问你怎么走使得权值最大
具体做法:
1.分析问题的最优解,找出最优解的性质,并刻画其结构特征:
问题的最优解:所有走法中最大的权值是多少?
最优解的性质和结构特征:只能向正下或者右下走,每走一行的最大权值等于前面一行的最大权值加上这一
行的走的两个方向中的最大值
2.递归的定义最优值:
要找到从0行出发的最优值,就要找到从第1行出发的最优值
要找到从1行出发的最优值,就要找到从第2行出发的最优值
………………………
要找到第3行出发的最优值,就要找到从最后一行出发的最优值
题目要你求从0行出发的最优值,那么我们就是要找到从第一行出发的最优值,加上第0行到第1行的最优值
但是,很重要的一点,我们需要递归求解,要先求解从倒数第一行出发的最优值,然后根据从倒数第一行出
发的最优值求出从倒数第二行出发的最优值
3.采用自底向上的方式计算问题的最优值
4.根据计算最优值时间得到的信息,构造最优解
这个就是问你具体是怎么走的,我们需要在求解子问题的时候保存一些信息,采用构造出最优解(最优值和
最优解是不同的,最优值在本问题中是一个走法中权值之和最大的那一个,而最优解是具体的走法
解法:
dp【i】【j】:代表从第i行第j列出发得到的最优值
dp【i】【j】=max(dp【i+1】【j】,dp【i+1】【j+1】)+a【i】【j】
表示从第i行第j列出发的最优值等于到i+1行的两种走法中最大的那一个加上出发点的权值
来自:《算法竞赛入门经典》
转载:https://blog.csdn.net/qq_39382769/article/details/80788294