打家劫舍问题总的来说就是相邻的数不能同时取
问题1
这个问题就是从头到尾遍历一个数组,数组相邻的数不能同时取,求最后的最大值
dp[i][0] = max(dp[i-1][0], dp[i-1][1])
dp[i][1] = dp[i-1][0] + prices[i]
问题2
这个问题描述的是数组的头尾也算是相邻,因此只要我们不同时取头尾就好,按照问题1的思路找prices(0, size()-1),和prices(1, size())的最大值,两者取最大即为最后的最大值
问题3
这个问题也是相邻不能取的问题,但这时候已经不是一维数组了,而是一颗树,因此是树形的dp
遍历函数每次返回一个数组记为p,p[0]代表不取当前节点子节点的最大值,p[1]代表取当前节点子节点的最大值
int *lastOrder(TreeNode *root) {
if(!root)return nullptr;
int *left = lastOrder(root ->