day78【代码随想录】区间DP专题

这篇具有很好参考价值的文章主要介绍了day78【代码随想录】区间DP专题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

1、多边形三角剖分的最低得分
2、猜数字大小 II
3、让字符串成为回文串的最少插入次数
4、切棍子的最小成本
5、戳气球
6、合并石头的最低成本


每日一题day76:多边形三角剖分的最低得分(力扣1039)

day78【代码随想录】区间DP专题
day78【代码随想录】区间DP专题
分析:
大佬详细题解

class Solution {
    public int minScoreTriangulation(int[] values) {
        int[][] dp = new int[values.length][values.length];
        for(int i=values.length-3;i>=0;i--){  //注意 i从values.length-3开始
            for(int j=i+2;j<values.length;j++){ //j从i+2开始
                //i倒序枚举 j正序枚举
                int res = Integer.MAX_VALUE;
                for(int k = i+1;k<j;k++){
                    res = Math.min(res,dp[k][j]+dp[i][k]+values[i]*values[j]*values[k]);
                }
                dp[i][j] = res;
            }
        }
        return dp[0][values.length-1];
    }
}

每日一题类似题目:猜数字大小 II(力扣375)

day78【代码随想录】区间DP专题
day78【代码随想录】区间DP专题
分析:
这一段题解是灵魂!
day78【代码随想录】区间DP专题
大佬题解
类似于算法书中的矩阵连乘问题

class Solution {
    public int getMoneyAmount(int n) {
        int[][]  dp = new int[n+1][n+1];
        for(int i = n-1;i>=1;i--){
            for(int j=i+1;j<=n;j++){
                dp[i][j] = j+dp[i][j-1];
                for(int k=i;k<j;k++){
                    dp[i][j] = Math.min(dp[i][j],Math.max(dp[i][k-1],dp[k+1][j])+k);
                }
            }
        }
        return dp[1][n];
    }
}

每日一题类似题目:让字符串成为回文串的最少插入次数(力扣1312)

day78【代码随想录】区间DP专题
分析:
跟判断回文串思路一样,但是需要反过来处理
如果当前两个字符相等 s[i] == s[j] 那么就不需要做任何处理 dp[i][j] = dp[i+1][j-1]
反之,如果当前两个字符不相等,那么就需要增加操作数了,那么选择增加哪个字符 操作数最少?dp[i][j] = Math.min(dp[i+1][j],dp[i][j-1])+1;

class Solution {
    public int minInsertions(String s) {
        int n = s.length();
        int[][] dp = new int[n+1][n+1];
        for(int i=n-1;i>=1;i--){
            for(int j=i+1;j<=n;j++){
                if(s.charAt(i-1)!=s.charAt(j-1)){
                    dp[i][j] = Math.min(dp[i][j-1],dp[i+1][j])+1;
                }else{
                    dp[i][j] = dp[i+1][j-1];
                }
            }
        }
        return dp[1][n];
    }
}

每日一题类似题目:切棍子的最小成本(力扣1547)******hard

day78【代码随想录】区间DP专题
day78【代码随想录】区间DP专题
分析:
有些类似于矩阵连乘问题:

day78【代码随想录】区间DP专题

class Solution {
    public int minCost(int n, int[] cuts) {
        int length = cuts.length;
        //数组扩容 加0 和n
        Arrays.sort(cuts);
        int[] newCuts = new int[length+2];
        for(int i=0;i<length;i++){
            newCuts[i+1] = cuts[i];
        }
        newCuts[0] = 0;
        newCuts[length+1] = n;

        int len = length+2;
        int[][] dp = new int[len][len];
        for(int i=len-3;i>=0;i--){
            for(int j=i+2;j<len;j++){
                 int  ans = Integer.MAX_VALUE;
                 for(int k = i+1;k<j;k++){
                     ans = Math.min(ans,dp[i][k]+dp[k][j]);
                 }
                 dp[i][j] = ans + newCuts[j]-newCuts[i];
            }
        }
        return dp[0][len-1];
    }
}

每日一题类似题目:戳气球(力扣312)******hard

day78【代码随想录】区间DP专题
分析:
类似于矩阵连乘问题:

day78【代码随想录】区间DP专题

class Solution {
    public int maxCoins(int[] nums) {
        int n =nums.length+2;
        int[] newNums = new int[n];
        for(int i=0;i<nums.length;i++){
            newNums[i+1] = nums[i];
        }
        newNums[0] =1;
        newNums[n-1] = 1;
        int[][] dp = new int[n][n];
        for(int i=n-3;i>=0;i++){
            for(int j=i+2;j<n;j++){
                int ans = 0;
                for(int k=i+1;k<j;k++){
                    ans = Math.max(ans,dp[i][k]+dp[k][j]+newNums[i]*newNums[j]*newNums[k]);
                }
                dp[i][j] = ans;
            }
        }
        return dp[0][n-1];
    }
}

每日一题day78类似题目:合并石头的最低成本(力扣1000)**************So hard

day78【代码随想录】区间DP专题

分析:
大佬题解
比戳气球难理解多了文章来源地址https://www.toymoban.com/news/detail-412140.html

class Solution {
    public int mergeStones(int[] stones, int k) {
        int n = stones.length;
        if((n-1)%(k-1)>0){
            return -1;
        }
        //前缀和数组
        int[] pre = new int[n+1];
        int res = 0;
        for(int i=0;i<stones.length;i++){
            res +=stones[i];
            pre[i+1]+=res;
        }

        int[][] dp = new int[n][n];
        //开始合成石头
        for(int i=n-1;i>=0;i--){
            for(int j=i+1;j<n;j++){
                dp[i][j] = Integer.MAX_VALUE;
                for(int m = i;m<j;m+=k-1){
                    dp[i][j] = Math.min(dp[i][j],dp[i][m]+dp[m+1][j]);
                }
                if((j-i)%(k-1)==0){
                    //合并为1堆
                    dp[i][j] += pre[j+1]-pre[i];
                }
            }
        }
        return dp[0][n-1];
    }
}

到了这里,关于day78【代码随想录】区间DP专题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录23| 93.复原IP地址, 78.子集, 90.子集II

    题目链接/文章讲解:链接地址 视频讲解:链接地址 题目链接/文章讲解:链接地址 视频讲解:链接地址 题目链接/文章讲解:链接地址 视频讲解:链接地址

    2024年02月11日
    浏览(75)
  • 代码随想录day59

    647. 回文子串 给你一个字符串  s  ,请你统计并返回这个字符串中  回文子串  的数目。 回文字符串  是正着读和倒过来读一样的字符串。 子字符串  是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不

    2024年02月07日
    浏览(28)
  • 代码随想录Day50

    昨天因为准备面试所以咕咕了一天。今天继续学习动规算法,尽管背包问题已经结束但其中的各类思想仍需要进一步理解。 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两

    2023年04月14日
    浏览(32)
  • 代码随想录day02

    ● 力扣题目链接 ● 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 思路 ● 暴力排序,时间复杂度O(n + nlogn) ● 使用双指针,时间复杂度O(n) 代码 ● 力扣题目链接 ● 给定一个含有 n 个正整数的数组和一个正整

    2024年02月13日
    浏览(27)
  • 代码随想录day01

    ● 思维不难,主要是考察对代码的掌控能力 ● 内存中的存储方式:存放在连续内存空间上的相同类型数据的集合 ● 数组可以通过下标索引获取到下标对应的数据 ● 数组下标从0开始 ● 因为内存空间地址连续,因此删除或增加元素的时候,难免移动其他元素地址 ● Java中的

    2024年02月13日
    浏览(38)
  • 代码随想录Day62

    今天继续学习单调栈解决相关问题。 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。 对于每个 0 = i nums1.length ,找出满足 nums1

    2024年02月01日
    浏览(35)
  • 代码随想录day11

    20. 有效的括号   思路:这里用模拟栈的方法会更好理解,也就是我们每次遇到朝左方向的三种类型的时候,就加入相反方向的右括号到result栈中。由于栈是一个先进后出的方式,所以我们会有一个判断stack当前为不为空,和stack[-1]是不是和当前循环到的括号相同。如果说相同

    2024年02月13日
    浏览(29)
  • 代码随想录day44

    完全背包 其实就是每个物品可以使用无数次,给我们一个容器,装满这个容器的最大价值是多少。 思路: 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求排列数就是外层for遍历背包,内层for循环遍历物品。 完全背包的组合和排序 518. 零钱兑换 II 题目 给你

    2023年04月17日
    浏览(40)
  • 代码随想录Day58

    昨天因为志愿活动和笔试耽误了一整天,今天继续学习动规解决子序列问题。 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,\\\"ace\\\"是\\\"abcde\\\"的一个子序列,

    2023年04月27日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包