典型例题:
给定一个非负数组,求不相邻元素的最大和。如下列数组
arr[7] = { 1,2,4,1,7,8,3 },最大和是15
思路:
该题目可以转换成0or1背包问题,
递归思路:(自顶向下)
对于第七个数字来说:有两种可能,
A:选arr[6]是最大和中的一个组成数,然后看arr[4]与arr[4]之前最大和是什么情况。(选arr[6] ,就是背包中1的问题)
B:不选arr[6],认为组成最大和的数字没有arr[6],然后看arr[5]是什么情况。(不选arr[6] ,就是背包中0的问题)
具体思路如下两个图
非递归思路(自底向上)
可以看到在递归思路图中画红色圈的部分仍然会被重复计算,效率低下。因此我们用一个数组opt来存储每次的结果。每次只管索引i的前面的几个数字,不管之后的数字。
代码
递归:自上而下
int rec_opt(vector<int>&arr,