312. 戳气球

本文探讨了著名的气球戳破问题,通过动态规划方法寻找戳破一系列气球以获得最大分数的最优策略。文章详细解析了状态转移方程,展示了如何避免回溯过程中的依赖性,并提供了两种实现方式的代码示例。

问题

在这里插入图片描述
在这里插入图片描述

例子

在这里插入图片描述

思路
回溯时间太久【第一次有n个选择,第二次有n-1个选择,时间为O(n!)】
动态规划【有最字】+分治
区间[i, j] 戳破的气球为k。
k戳破后,区间变成了[i, k) 和(k, j],即[i, i+1, … k-1, k+1, …j],那么k+1啥时候戳破对[i, k)的结果有影响,如果先戳破k-1,再戳破k+1,k-1的右边是k+1,计算时[k-2]*[k-1]*[k+1],如果先戳破,(k, j]中的k+1,再戳破[i, k)中的k-1,此时k-1右边的变成了k+2,计算时[k-2]*[k-1]*[k+2]
,即左右两边区间的计算产生了依赖。
如何不产生依赖呢?气球k,放在最后戳爆它。
k为区间[i, j]间最后一个戳爆的气球,它把[i, j]分为了[i, k-1]和[k+1, j]两个区间,可分别求出

  • 方法1
    状态转移方程  dp[i][j]为[i,j]区间的最大值dp[i][j]=max(dp[i][k−1]+dp[k+1][j]+arr[i−1]∗arr[k]∗arr[j+1])  i<=k<=j 状态转移方程~~ dp[i][j]为[i,j]区间的最大值\\ dp[i][j]=max(dp[i][k-1]+dp[k+1][j]+arr[i-1]*arr[k]*arr[j+1]) ~~i<=k<=j   dp[i][j][i,j]dp[i][j]=max(dp[i][k1]+dp[k+1][j]+arr[i1]arr[k]arr[j+1])  i<=k<=j

  • 方法2
    $$

    $$

代码

//方法1 自顶向下
class Solution {
    public int maxCoins(int[] nums) {
        //创建虚拟边界
        int[] arr = new int[nums.length+2];
        System.arraycopy(nums,0,arr,1,nums.length);
        
        arr[0]=1;
        arr[arr.length-1]=1;
        
        int[][] dp = new int[arr.length][arr.length];
        return get(arr,1,arr.length-2,dp);

    }
    public int get(int[] arr,int i,int j, int[][] dp) {
        if(i>j) return 0;
        if(dp[i][j]>0) return dp[i][j];
        int max = 0;
        for(int k=i; k<=j; k++) {
            max = Math.max(max, arr[i-1]*arr[k]*arr[j+1]+get(arr, i,k-1,dp)+get(arr,k+1,j,dp));
        }
        dp[i][j]=max;
        return max;
    }
}
//方法2 自下而上
class Solution {
    public int maxCoins(int[] nums) {
        int n = nums.length;
        //创建虚拟边界
        int[] arr = new int[n+2];
        System.arraycopy(nums,0,arr,1,n);
        
        arr[0]=1;
        arr[n+1]=1;
        
        int[][] dp = new int[n+2][n+2];
        
        for(int len = 1; len<=n; len++) {
            for(int i=1; i+len-1<=n; i++) {
                int j = i+len-1;
                for(int k=i; k<=j; k++) {
                    dp[i][j]=Math.max(dp[i][j], arr[i-1]*arr[k]*arr[j+1]+dp[i][k-1]+dp[k+1][j]);
                }
            }
        }
        return dp[1][n];

    }

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值