hot100打卡——day08

337. 打家劫舍 III

https://leetcode.cn/problems/house-robber-iii/description/?envType=problem-list-v2&envId=2cktkvj

java 复制代码
class Solution {
    public int rob(TreeNode root) {
        int[] dp = dfs(root);
        return Math.max(dp[0], dp[1]);
    }

    // dp[0] 表示当前节点取  dp[1] 表示当前节点不取
    int[] dfs(TreeNode node) {
        if (node == null) return new int[] {0, 0};

        int[] left = dfs(node.left);
        int[] right = dfs(node.right);

        // 取当前节点
        int cur = node.val + left[1] + right[1];
        // 不取当前节点
        int notCur = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        
        return new int[] {cur, notCur};
        
    }
}

这道题直接使用树形dp进行解决就行了,每次都是返回要取当前节点和不取当前节点两种情况

121. 买卖股票的最佳时机

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/?envType=problem-list-v2&envId=2cktkvj

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        // dp[i][0] 表示第i天持有股票的最大盈利
        // dp[i][1] 表示第i天不持有股票的最大盈利
        int[][] dp = new int[n][2]; 
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < n; i++) {
            dp[i][0] = Math.max(dp[i-1][0], dp[i][1] - prices[i]);
            dp[i][1] = Math.max(dp[i-1][1], dp[i][0] + prices[i]);
        }
        return dp[n-1][1];
    }
}

每一天的状态无非就是持有股票和不持有两种状态,那我们要做的就是分别统计持有和不持有的一个最大盈利情况

注意:第i天不持有,可能是第i-1天有,第i天卖出,也可能是从第i-1天就没有;第i天有,可能是从第i-1天就有,也可能是第i-1天没有,第i天刚买入的

309. 买卖股票的最佳时机含冷冻期

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/?envType=problem-list-v2&envId=2cktkvj

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;

        if (n == 1) return 0;
        if (n == 2) return Math.max(prices[1]-prices[0], 0);

        // dp[i][0] 表示第i天不持有
        // dp[i][1] 表示第i天持有
        int[][] dp = new int[n + 1][2];

        dp[0][1] = Integer.MIN_VALUE; // 不可能
        dp[1][1] = -prices[0];
        dp[0][0] = 0;
        dp[1][0] = 0;

        for (int i = 1; i < n; i++) {
            dp[i+1][0] = Math.max(dp[i][0], dp[i][1] + prices[i]);
            dp[i+1][1] = Math.max(dp[i][1], dp[i-1][0] - prices[i]);
        }
        return dp[n][0];
    }
}

312. 戳气球

https://leetcode.cn/problems/burst-balloons/description/?envType=problem-list-v2&envId=2cktkvj

java 复制代码
class Solution {
     public int maxCoins(int[] nums) {
        int n = nums.length + 2;
        int[] bo = new int[n];
        bo[0] = bo[n-1] = 1;

        for (int i = 1; i < n-1; i++) bo[i] = nums[i-1];
        
        int[][] dp = new int[n][n];

        for (int i = n - 3; i >= 0; i--) {
            for (int j = i+2; j < n; j++) {
                for (int k = i+1; k < j; k++) {
                    int sum = bo[i] * bo[k] * bo[j] + dp[i][k] + dp[k][j];
                    dp[i][j] = Math.max(dp[i][j], sum);
                }
            }
        }
        return dp[0][n-1];
    }
}

这道题的解题思路就是倒着来,我们首先在原来的数组两边分别塞入一个1,这样对边界的处理就会更加的简单

我们可以将问题进行拆解,首先我们需要不断的枚举区间,当然区间的大小至少是3,然后我们需要枚举区间中每一个元素被戳破时的最大价值,也就是boi * bok * boj + dpik + dpkj

相关推荐
驭渊的小故事1 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
强哥聊算力4 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
哦虎!6 小时前
【JavaEE】网络初识
java
for_ever_love__6 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓7 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡7 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
Navigator_Z7 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy8 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
IT研究室8 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项8 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs