Problem
给定一组整数,要求只能间隔地取数出来,试问取出来的数最大和是多少?
Example
A={1,2,3};
Return 4
A={3,1,1,2};
Return 5;
Algorithm
典型的动态规划问题。
列状态转移方程:设sum[i]表示前i个数的最大间隔和,要求sum[i],则有两种情况。
- 若选第i个数,则sum[i]=sum[i-2]+nums[i]
- 若不选第i个数,则sum[i]=sum[i-1]
实际上sum[i]的选择应该是以上两者取最大值,故状态转移方程为
sum[i]=max{sum[i-2]+nums[i], sum[i-1]}
于是便可以写出代码了。
考试的时候回想到了LeetCode上做过的题目。其实这题也是LeetCode上的原题,原题是:198. House Robber:https://leetcode.com/problems/house-robber/
代码如下。
class Solution {
public:
int maxSum(vector<int>& nums) {
int n=nums.size();
if(n==0){return 0;}
if(n==1){return nums[0];}
vector<int> sum(n,0);
sum[0]=nums[0];
sum[1]=max(nums[0],nums[1]);
int i;
for(i=2;i<n;i++){
sum[i]=max(sum[i-1],sum[i-2]+nums[i]);
}
return sum[n-1];
}
};