DAY50
如果写累了就去写套磁信吧。
198打家劫舍
- class Solution {
- public:
- int rob(vector<int>& nums) {
- vector<int> dp(nums.size());
- dp[0]=nums[0];
- if(nums.size()==1) return 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];
- }
- };
213打家劫舍ii
数组成环,分三种情况:
- 不考虑首尾
- 不考虑首,仅考虑尾
- 不考虑尾,仅考虑首
注意,考虑不代表必选。
那么情况2 3 就已经包括了情况1。
写函数来解决,就不用挪数组。
注意是从dp[start]开始赋值
- class Solution {
- public:
- int getres(vector<int>nums,int start,int end){
- vector<int> dp(nums.size());
- if(start==end) return nums[start];
- dp[start]=nums[start];
- dp[start+1]=max(nums[start],nums[start+1]);
- //注意i的初值
- for(int i=start+2;i<=end;i++)
- dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
- return dp[end];
- }
- int rob(vector<int>& nums) {
- if(nums.size()==1) return nums[0];
- int res1=getres(nums,0,nums.size()-2);
- int res2=getres(nums,1,nums.size()-1);
- if(res1>res2) return res1;
- else return res2;
- }
- };
337打家劫舍 iii--树形DP
能想到:后序遍历,把孩子信息传到父节点:若孩子之和没有大于父节点,则买入父节点。反之买入孩子之和。还要注意一些复杂的逻辑。还是不会。
节点之间的状态影响进一步计算,那么是动态规划
状态dp表示抢或不抢,抢的话,就不能动两个孩子;不抢的话,就要考虑动孩子了。
- 暴力递归
超时了:
-
/**
-
* 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) {
-
if(root==nullptr) return 0;
-
if(root->left==nullptr&&root->right==nullptr) return root->val;
-
int val1=root->val;
-
if(root->left) val1+=rob(root->left->left)+rob(root->left->right);
-
if(root->right) val1+=rob(root->right->left)+rob(root->right->right);
-
int val2=rob(root->left)+rob(root->right);
-
return max(val1,val2);
-
}
-
};
-
动态规划
记录当前偷与不偷得到的最大金额。
树形DP,在树上做状态转移。
求一个节点,偷与不偷两个状态分别所得到的金钱,返回值是一个长度为2的数组。
- /**
- * 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:
- vector<int> getres(TreeNode* cur){
- if(cur==nullptr) return {0,0};
- vector<int> left=getres(cur->left);
- vector<int> right=getres(cur->right);
- int val1=cur->val+left[0]+right[0];
- int val2=max(left[0],left[1])+max(right[0],right[1]);
- return {val2,val1};
- }
- int rob(TreeNode* root) {
- vector<int> res=getres(root);
- return max(res[0],res[1]);
- }
- };