https://leetcode.com/problems/house-robber/
题目设计了一个抢劫犯的情景,其实就是求数组中不相邻数据进行组合得到的最大值
举一个例子
假设数据: 8 3 6 15 4 9 7 10
那么首先可能选取 8 , 3
每一个数字的选取都是根据他的前两个数字,前三个数字得到的最大值进行选择,等到6的时候考虑前面只能和8组合 8,3,14
到数字15,那么就可以考虑在8,3中进行组合 8,3,14,23,4,9,7,10
接下来的步骤:
8,3,14,23,18,9,7,10
8,3,14,23,18,32,7,10
8,3,14,23,18,32,30,10
8,3,14,23,18,32,30,42 最后是42
class Solution { public: int rob(vector<int> &num) { if(num.empty()) { return 0; } int res = 0; int length = num.size(); if(1 == length) { return num[0]; } if(length >= 3) { num[2] = num[0]+num[2]; } for(int i = 3; i < length; i++) { if(num[i-2]>num[i-3]) { num[i] += num[i-2]; } else { num[i] += num[i-3]; } } return (num[length-2]>num[length-1])? num[length-2]:num[length-1]; } };
A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫
即A[i+1][0] = max(A[i][0], A[i][1]).. 那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] = A[i][0]+money[i+1].
实际上只需要两个变量保存结果就可以了,不需要用二维数组
LeetCode—House Robber 寻找数组不相邻组合最大值DP
原文地址:http://blog.csdn.net/xietingcandice/article/details/45015119