复习打家劫舍:
class Solution {
public:
int rob(vector<int>& nums) {
vector<int> dp(nums.size());
if(nums.size()==0) return 0;
if(nums.size()==1) return nums[0];
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i=2; i<nums.size(); ++i) {
dp[i] = max(dp[i-1], dp[i-2]+nums[i]);
}
return dp[nums.size()-1];
}
};
class Solution {
public:
int test(vector<int>& nums, int start, int end) {
if(start==end) return nums[start];
vector<int> dp(nums.size());
dp[start] = nums[start];
dp[start+1] = max(nums[start], nums[start+1]);
for(int i=start+2; i<=end; ++i) {
dp[i] = max(dp[i-1], dp[i-2]+nums[i]);
}
return dp[end];
}
int rob(vector<int>& nums) {
if(nums.size()==0) return 0;
if(nums.size()==1) return nums[0];
int result1 = test(nums, 0, nums.size()-2);
int result2 = test(nums, 1, nums.size()-1);
return max(result1, result2);
}
};
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int rob(TreeNode* root) {
vector<int> result = process(root);
return max(result[0], result[1]);
}
vector<int> process(TreeNode* cur) {
if(cur==nullptr) return {0, 0};
vector<int> left = process(cur->left);
vector<int> right = process(cur->right);
// tou
int val1 = cur->val + left[0] + right[0];
// bu tou
int val2 = max(left[0], left[1]) + max(right[0], right[1]);
return {val2, val1};
}
};
dp[i][0]:第i天持有股票的最大金额
dp[i][1]:第i天不持有股票的最大金额
持有股票:当天买入;之前买入(持有)
不持有股票:当天卖出(之前持有);之前卖出
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(2));
dp[0][0] = -prices[0]; // 持有
dp[0][1] = 0; // 不持有
for(int i=1; i<prices.size(); ++i) {
dp[i][0] = max(dp[i-1][0], -prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
}
return dp[prices.size()-1][1];
}
};
买入的时候,持有的现金金额是根据之前不持有股票的最大金额
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==0) return 0;
vector<vector<int>> dp(prices.size(), vector<int>(2, 0));
dp[0][0] = -prices[0]; //持有
dp[0][1] = 0; //不持有
for(int i=1; i<prices.size(); ++i) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
}
return dp[prices.size()-1][1];
}
};