class Solution {
public:
int rob(vector<int>& nums) {
int length = nums.size();
//cout << "length = " << length << endl;
int dp[10000] = {0};
int max1 = 0;
int max2 = 0;
if (length == 0){
return 0;
}
if (length == 1){
return nums[0];
}
if (length == 2){
return nums[0] >= nums[1] ? nums[0] : nums[1];
}
int count = 0;
int max = 0;
if (length == 3){
while (count < 3){
if (nums[count] >max){
max = nums[count];
}
count++;
}
return max;
}
max = 0;
dp[0] = nums[0];
dp[1] = nums[0] >= nums[1] ? nums[0] : nums[1];
for (int i = 2; i<length - 1; i++){
//cout << "1: i = " << i << endl;
max = 0;
for (int j = 0; j < i - 1; j++){
// cout << "1: j = " << j << endl;
if (dp[j] >= max){
max = dp[j];
// cout << "1: max = " << max << endl;
}
}
cout << "### 1: max = " << max << endl;
dp[i] = max + nums[i];
//int max1 = dp[i];
if (dp[i] >max1){
max1 = dp[i];
}
//cout << "dp[i] = " << dp[i] << " 1: i = " << i << endl;
}
max = 0;
int fp[1000] = {0};
fp[1] = nums[1];
fp[2] = nums[2];
for (int i = 3; i < length; i++){
//cout << "2: i = " << i << endl;
for (int j = 1; j < i - 1; j++){
// cout << "2: j = " << j << endl;
if (fp[j] >= max){
max = fp[j];
// cout << "2: max= " << max << endl;
}
}
fp[i] = max + nums[i];
//cout << "fp[i] = " << fp[i] << " 1: i = " << i << endl;
if (fp[i]>max2){
max2 = fp[i];
}
}
if (max2 >= max1){
return max2;
}
else{
return max1;
}
}
};
这道题不要想的太复杂就是针对第一种情况的两种情况分类讨论,对于边界的处理要比第一种rober多了一个长度为三的处理,分成2到n-1,3到n两种情况处理
点击打开链接动态规划题目列表