Leetcode 312. 戳气球(记忆化搜索)

news/2024/5/18 21:56:25
  • Leetcode 312. 戳气球(记忆化搜索)
  • 题目
    • 有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
    • 现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。
    • 求所能获得硬币的最大数量。
    • n == nums.length
    • 1 <= n <= 300
    • 0 <= nums[i] <= 100
  • 解法
    • 动态规划:设 val[i+1]=nums[i] 同时 val[0]=val[n+1]=1 头尾加 1 方便计算,然后定义 dp[i][j] 为戳破(i,j)开区间所有气球获得最多金币数量,n 个气球所能获得的最大金币就是 dp[0][n+1] 的值,接下来求转移方程式
    • 转移方程式:我们假设最后戳破的是第 k 个气球、同时 i<k<j,可得转移方程式:dp[i][j] = Max(dp[i][k] + val[i]*val[k]*val[j] + dp[k][j]),代表(i,k)与(k,j)已经被戳破了、再加上第 k 个气球的金币
    • 使用记忆化搜索的方式递归获取结果,出口条件是:当 i>=j-1 时 dp[i][j]=0
    • 时间复杂度:O(n^3)dp[0][n+1] 区间为 n^2、然后迭代 k 为 n 次,空间复杂度:O(n^2)
  • 代码
    /**
     * 动态规划:设 val[i+1]=nums[i] 同时 val[0]=val[n+1]=1 头尾加 1 方便计算,然后定义 dp[i][j] 为戳破(i,j)开区间所有气球获得最多金币数量,
     * n 个气球所能获得的最大金币就是 dp[0][n+1] 的值,接下来求转移方程式
     * 转移方程式:我们假设最后戳破的是第 k 个气球、同时 i<k<j,可得转移方程式:dp[i][j] = Max(dp[i][k] + val[i]*val[k]*val[j] + dp[k][j]),
     * 代表(i,k)与(k,j)已经被戳破了、再加上第 k 个气球的金币
     * 使用记忆化搜索的方式递归获取结果,出口条件是:当 i>=j-1 时 dp[i][j]=0
     * 时间复杂度:O(n^3)dp[0][n+1] 区间为 n^2、然后迭代 k 为 n 次,空间复杂度:O(n^2)
     */
    private int solution(int[] nums) {
        // 判空
        if (nums == null || nums.length <= 0) {
            return 0;
        }

        // 设 val[i+1]=nums[i] 同时 val[0]=val[n+1]=1 头尾加 1 方便计算
        int[] val = getValByNums(nums);
        // valLen = n + 2
        int valLen = val.length;
        // System.out.println(Arrays.toString(val));

        // 记忆化搜索获取
        int[][] dp = new int[valLen][valLen];
        for (int i = 0; i < valLen; i++) {
            Arrays.fill(dp[i], -1);
        }
        recursionSearchDP(0, valLen-1, dp, val);

        return dp[0][valLen - 1];
    }

    /**
     * 记忆化搜索获取(left,right)获得的最大金币数
     */
    private int recursionSearchDP(int left, int right, int[][] dp, int[] val) {
        if (left >= right - 1) {
            return 0;
        }
        if (dp[left][right] >= 0) {
            return dp[left][right];
        }

        // 循环最后一个戳破的气球
        for (int k = left + 1; k < right; k++) {
            dp[left][right] = Math.max(dp[left][right], recursionSearchDP(left, k, dp, val)
                    + recursionSearchDP(k, right, dp, val) + val[left]*val[k]*val[right]);
        }

        return dp[left][right];
    }

    /**
     * 获取 val 数组,设 val[i+1]=nums[i] 同时 val[0]=val[n+1]=1 头尾加 1 方便计算
     */
    private int[] getValByNums(int[] nums) {
        int numLen = nums.length;
        int[] val = new int[numLen + 2];

        val[0] = 1;
        for (int i = 0; i < numLen; i++) {
            val[i+1] = nums[i];
        }
        val[val.length - 1] = 1;

        return val;
    }

http://www.niftyadmin.cn/n/393810.html

相关文章

Spring Boot 如何保证接口安全?有哪些常用的接口安全技术?

在当今互联网时代&#xff0c;保障接口安全已经成为了每个企业必须面对的重要问题。作为一个快速开发框架&#xff0c;Spring Boot 同样需要保障其接口的安全性。本文将详细介绍 Spring Boot 如何保证接口安全&#xff0c;以及常用的接口安全技术。 Spring Boot 接口安全介绍 …

SpringBoot之Transactional事务

目录 一、事务管理方式二、事务提交方式三、事务隔离级别四、事务传播行为1、Propagation.REQUIRED2、Propagation.SUPPORTS3、Propagation.MANDATORY4、Propagation.REQUIRES_NEW5、Propagation.NOT_SUPPORTED6、Propagation.NEVER7、Propagation.NESTED 五、事务回滚六、只读…

了解Session的本质

有一点我们必须承认&#xff0c;大多数web应用程序都离不开session的使用。这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制。 AD&#xff1a; 有一点我们必须承认&#xff0c;大多数web应用程序都离不开session的使用。这篇文章将会结合php以及http协…

chatgpt赋能python:Python如何只提取文本中的数字?

Python如何只提取文本中的数字&#xff1f; 随着数字化时代的到来&#xff0c;数字成为了我们生活中不可或缺的一部分。我们每天都需要处理大量的数字&#xff0c;比如账单、统计数据等等&#xff0c;这些数字都散落在各个文本中。如果我们需要将这些数字提取出来&#xf…

ASP.NET+SQL Sever2005 C语言教学网站及网上考试系统的设计与实现(论文+源代码+开题报告)

本文叙述了教学方式及考试方式的历史、现状、以及ASP.NET语言和SQL server2000数据库管理系统的概况。重点介绍了C语言教学网站、网上考试系统和在线交流模块的实现过程:包括系统分析、系统调查、数据流程分析、功能设计、数据库设计、系统的运行环境、系统测试及调试。本系统…

【编译、链接、装载三】编译器——语法分析、词法分析、语义分析、编译器后端

【编译和链接三】编译器——语法分析、词法分析、语义分析、编译器后端 内容总结一、词法分析&#xff08;Lexical Analysis&#xff09;二、语法分析 &#xff08;Syntactic Analysis, or Parsing&#xff09;三、语义分析&#xff08;Semantic Analysis&#xff09;四、编译器…

JVM那些事 (含经典面试题)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 前言: 1. JVM&#xff1a;Java 虚拟机&#x…

chatgpt赋能python:使用Python向微信发送信息的方法详解

使用Python向微信发送信息的方法详解 Python作为一种广泛应用于科学计算、数据处理等多个领域的编程语言&#xff0c;也可以用于自动化工作流程和自动发送微信消息等操作&#xff0c;大大提高了工作效率。如果你想在日常工作中用Python向微信群或个人发送自定义信息&#…