区间DP (Java) 解析/模板/案例

本文介绍了区间动态规划的基本思想,包括枚举区间和枚举端点两种方法,并通过解析leetcode上的1312和1039题,详细阐述了如何应用区间DP解决实际问题,如构造回文串和多边形三角剖分的最低得分。
摘要由CSDN通过智能技术生成

一. 区间DP简单介绍

        区间DP,是经常会用到的、解决区间问题的一种方法,经常以动态规划(dfs/记忆化搜索)的形式展现,最核心的思想就是枚举区间(枚举端点),寻找切割点,处理因切割点而产生的结果,进行区间累加或者选取个别区间,从而解决整体的问题。

二. 区间DP模板

枚举区间 

class Solution {
    public int 区间dp(int[] v) {
        int n = v.length;
        int[][] dp = new int[n][n];
        //枚举区间长度
        for(int len = 满足题目要求的最小值; len <= n; len++){
            //枚举左端点
            for(int L = 0; L+len-1 < n; L++){
                //枚举右端点
                int R = L + len - 1;
                //设置动态规划数组的初始值
                dp[L][R] = maxvalue;
                or
                dp[L][R] = minvalue;
                //枚举区间内的可能的切割点
                for(int k = L+1; k < R; k++){
                    dp[L][R] = Math.min(dp[L][R], dp[L][k] ? dp[k][R] ? 因切割点而产生的特殊值);
                }
            }
        }
        //返回规定的区间范围
        return dp[0][n-1];
        or
        return dp[1][n]
        or
        others
    }
}

枚举端点

枚举端点的方法和枚举区间本质上都一样,有些题目反而用枚举端点的方法更容易思考

class Solution {
    public int 区间dp(int[] v) {
        int[][] dp = new int[v.length][v.length];
        //枚举左端点,左端点经常从大到小枚举,为什么请看下文
        for(int i = v.length-3; i >= 0; i--){
            //枚举右端点
            for(int j = i+2; j < v.length; j++){
                //dp数组初始值
                dp[i][j] = Integer.MAX_VALUE;
                or
                dp[i][j] = Integer.MIN_VALUE;
                //枚举切割点
                for(int k = i+1; k < j; k++){
                    dp[i][j] = Math.min(dp[i][j],dp[i][k]?dp[k][j]?因切割点而产生的特殊值);
                }  
            }
        }
        return dp[0][v.length-1];
    }
}

三. 区间DP经典案例

1.leetcode1312 让字符串成为回文串的最少插入次数

给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。

请你返回让 s 成为回文串的 最少操作次数 。

「回文串」是正读和反读都相同的字符串。

输入:s = "mbadm"
输出
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值