• day-48 代码随想录算法训练营(19) 动态规划 part 09


    198.打家劫舍

    思路:
    • 1.dp存储:偷到第i家时,偷到的最大金额
    • 2.dp[i]=max(dp[i-1],dp[i-2]+numa[i])
    • 3.初始化:dp[0]=nums[0]  dp[1]=max(nums[0],nums[1])
    • 4.遍历顺序:2-n

    213.打家劫舍II

    分析:考虑两种情况:不考虑偷第一家、不考虑偷最后一家
    思路:
    • 1.dp存储:偷到第i家时,偷到的最大金额
    • 2.dp[i]=max(dp[i-1],dp[i-2]+nums[i])
    • 3.初始化:分情况初始化
    • 4.遍历顺序:1.0~n-1   2.1~n

    337.打家劫舍III

    分析:
    • 递归+动态规划

    思路:

    • 后序遍历,每个节点都有两个状态,偷或者不偷
    • 偷的时候,子节点都不能偷;不偷的时候,左右节点考虑偷
    1. class Solution {
    2. public:
    3. int rob(TreeNode* root) {
    4. vector<int>res=judge(root);
    5. return res[0]>res[1]?res[0]:res[1];
    6. }
    7. vector<int> judge(TreeNode*root){
    8. if(root==nullptr) return {0,0};
    9. vector<int>left=judge(root->left);
    10. vector<int>right=judge(root->right);
    11. int valYes=root->val+left[0]+right[0];//偷当前节点
    12. int valNo=max(left[0],left[1])+max(right[0],right[1]);
    13. return {valNo,valYes};
    14. }
    15. };

    121.买卖股票的最佳时机

    思路一:贪心
    • 遍历数组,每次取最小值,并且每次都用当前值-最小值,更新最大差值
    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. //分析:只有卖出>买入才有利润,只能买一次
    5. int res=0,minNum=INT_MAX;
    6. for(auto it:prices){
    7. minNum=min(it,minNum);
    8. res=max(it-minNum,res);
    9. }
    10. return res;
    11. }
    12. };

    思路二:

    1.dp存储:

    2.dp

    3.初始化

    4.遍历顺序:

    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int n=prices.size();
    5. vector<vector<int>> dp(n,vector(2));
    6. dp[0][0]-=prices[0];//持有
    7. dp[0][1]=0;//不持有
    8. for(int i=1;i<n;i++){
    9. dp[i][0]=max(dp[i-1][0],-prices[i]);//当前持有(之前买的和当前买的取最大值)
    10. dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0]);//当前不持有(之前就不持有和今天不持有)
    11. }
    12. return dp[n-1][1];
    13. }
    14. };

    122.买卖股票的最佳时机||

    思路一:贪心
    • 只要有利润就直接进行买卖
    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int res=0;
    5. for(int i=1;isize();i++){
    6. if(prices[i]>prices[i-1]) res+=prices[i]-prices[i-1];
    7. }
    8. return res;
    9. }
    10. };
    思路二:动态规划

  • 相关阅读:
    windows 11部署wsl环境
    latex,不带行号的algorithm
    BGP进阶:BGP 基础实验配置
    Java进阶02 Array、内存分析、this、面向对象、继承、override、super、实例化、多态、向下转型、Object
    如何估算transformer模型的显存大小
    如何写好项目管理应聘简历?
    被忽视的数据中心非业务网络规划
    stack,queue,priority_queue的模拟实现,适配器deque
    视频剪辑音效处理软件有哪些?视频剪辑软件那个好用
    Sentinel 规则
  • 原文地址:https://blog.csdn.net/Ricardo_XIAOHAO/article/details/132801750