思路一:dp(当前状态有前两个状态决定)
dp[i]表示前i总时长
转移方程:dp[i]=max(dp[i-2]+nums[i],dp[i-1])
边界:dp[0]=nums[0] ;
dp[1] = max(nums[0], nums[1]);
class Solution {
public:
int massage(vector<int>& nums) {
//dp[i]表示前i总时长 dp[i]=max(dp[i-2]+nums[i],dp[i-1]) 边界:dp[0]=nums[0] dp[1]=nums[1]
int n = nums.size();
if (!n) return 0;
if (n <= 2) return *max_element(nums.begin(), nums.end());
vector<int> dp(n);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < n; ++i) {
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[n - 1];
}
};
易错点:
1:dp[1] = max(nums[0], nums[1]); 而不是:dp[1] = nums[1];
思路二:dp(当前状态有前一个状态决定)
dp[i][0]表示不接第i个的最大时长 dp[i][1]表示接第i个的最大时长
转移方程:
dp[i][0]=max(dp[i-1][0],dp[i-1][1]) 第i-1个接不接都可以
dp[i][1]=dp[i-1][0]+nums[i] 第i个接第i-1个只能不接
边界:
dp[0][0] = 0;
dp[0][1] = nums[0];
class Solution {
public:
int massage(vector<int>& nums) {
int n = nums.size();
if (!n) return 0;
vector<vector<int>> dp(n, vector<int>(2));
dp[0][0] = 0;dp[0][1] = nums[0];
for (int i = 1; i < n; ++i) {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = dp[i-1][0] + nums[i];
}
return max(dp[n - 1][0], dp[n - 1][1]);
}
};