线性动态规划专讲

简介: 线性动态规划专讲

线性规划概念

动态规划的主要特点是状态的推导是按照问题规模 i ii 从小到大依次推过去的(或者从后往前一直推过来的,比如「石子游戏」、「2140.解决智力问题」就是从后往前推的),较大规模的问题的解依赖较小规模的问题的解。

通常做此类问题步骤如下:

image.png

LeetCode 877. 石子游戏

class Solution {
    public boolean stoneGame(int[] piles) {
        int n = piles.length;
        long[][] dp = new long[n + 1][n + 1];
        // dp[i][j]代表从区间[i,j]之间获得的最多分数
        // dp[i][j] = Math.max(piles[i] + dp[i + 1][j], dp[i][j - 1] + plies[j])
        // dp[i][i] = 0
        // dp[0][n - 1] > 0 ? true : false;
        for (int i = 0 ; i < n; i++) {
            dp[i][i] = 0;
        }
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                dp[i][j] = Math.max(piles[i] + dp[i + 1][j], dp[i][j - 1] + piles[j]);
            }
        }
        return dp[0][n - 1] > 0 ? true : false;
    }
}

LeetCode 2140. 解决智力问题

class Solution {
    public long mostPoints(int[][] q) { 
        int n = q.length;
        // dp[i]的含义是从下标i~n-1获取的最大分数值
        // dp[i] = Math.max(dp[Math.min(n, q[i][1])] + q[i][0], dp[i])
        long[] dp = new long[n + 1];
        for (int i = n - 1; i >= 0; i--) {
            dp[i] = Math.max(dp[Math.min(n, i + q[i][1] + 1)] + q[i][0], dp[i + 1]);
        }
        return dp[0];
    }
}

LeetCode 72. 编辑距离

class Solution {
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        // 含义:dp[i][j]代表Word1从下标0~i和word2从下标0~j所使用的的最少操作次数
        // 状态转移方程:dp[i][j] = Math.min(dp[i  -1][j] + 1,Math.min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + (word1.charAt(i - 1) != word2.charAt(j - 1) ? 1 : 0)));
        int[][] dp = new int[n + 1][m + 1];
        if (n * m == 0) {
            return n + m;
        }
        for (int i = 0; i <= n; i++) {
            dp[i][0] = i;
        }
        for (int j = 0 ; j <= m ; j++) {
            dp[0][j] = j;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int left = dp[i  -1][j] + 1;
                int down = dp[i][j - 1] + 1;
                int left_down = dp[i - 1][j - 1];
                if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
                    left_down++;
                }
                dp[i][j] = Math.min(left_down, Math.min(left, down));
            }
        }
        return dp[n][m];
    }
}


相关文章
|
存储 监控 安全
[大厂实践] 无停机迁移大规模关键流量 (下)
[大厂实践] 无停机迁移大规模关键流量 (下)
91 0
|
6月前
|
人工智能 缓存 自然语言处理
ChatGPT消息发不出去?ChatGPT没反应?那是这个步骤少做了!
今天在工作的过程中,我正准备登陆ChatGPT咨询一些关于文案的问题,但突然发现自己无法发送消息了。 “ChatGPT消息发送故障,但历史对话仍可查看。为了解决问题,您可以先访问OpenAI官方网站:https://status.openai.com/。 这个网站提供了Open AI系统的实时状态监控,非常方便实用。”
167 0
ChatGPT消息发不出去?ChatGPT没反应?那是这个步骤少做了!
|
6月前
|
JavaScript
Vue引入Echarts图表的使用
Vue引入Echarts图表的使用
|
6月前
|
SQL 存储 关系型数据库
ADBPG优化基础(二)SQL优化
承接上一篇,这次跟大家分享一些与SQL优化相关的经验,希望能够帮助大家了解如果更有效率的使用ADBPG数据库。ADBPG数据库使用基于成本(cost-based)的优化器,像其他的数据库一样,在生成计划时会考虑联接表行数、索引、相关字段基数等因素,除此之外,优化器还会考虑数据所在的segment节点...
ADBPG优化基础(二)SQL优化
|
6月前
|
弹性计算 监控 自动驾驶
基于VPC对等连接与转发路由器组合实现多VPC互通
上周在给某自动驾驶企业落地LANDING ZONE。遇到了一个网络上面的问题。客户诉求:“客户会由多个软件供应商(ISV)提供部分功能,不同ISV人员需要登录到云控制台进行软件发布。客户希望对供应商能够做到强隔离,包括资源管理、人员身份权限及财务隔离。并且部分供应商的软件之间需要互相调用,且调用数据...
146 0
基于VPC对等连接与转发路由器组合实现多VPC互通
|
6月前
|
存储 传感器 机器人
创新精密驱动技术,助力企业数字化转型 ——知行驱控一体化柔性自适应末端执行器
近年来,机器人的发展及应用使得高可靠性和高精度的柔性机器人末端的需求也越来越多。现有的末端执行器并不能完全满足多样化的场景需求,灵巧手的售价太高不适合工业领域应用。机器人抓取系统广泛应用在产品装配、仓储物流、检测等领域,因此对机器人末端的灵活度、精确度、柔性有更高的要求。如在大部分电子产品装配还都以...
125 0
创新精密驱动技术,助力企业数字化转型 ——知行驱控一体化柔性自适应末端执行器
|
6月前
|
传感器 自动驾驶 安全
专访镭神智能胡小波:技术长征?国产激光雷达的逆袭之路
摘要:本期,《成长在阿里云》走入镭神智能,特邀嘉宾镭神智能创始人、CEO胡小波,听听从业20余年的他对于激光雷达的行业的经验看法。
169 0
专访镭神智能胡小波:技术长征?国产激光雷达的逆袭之路
|
6月前
|
搜索推荐 关系型数据库 分布式数据库
使用 PolarDB 开源版 采用array数组和gin索引高效率解决用户画像、实时精准营销类业务需求
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍使用 PolarDB 开源版高效率解决用户画像、实时精准营销类业务需求测试...
96 0
|
6月前
|
编解码 Serverless
大咖与小白的日常:音视频快速转码,资源交付有保障
小白手上有几百个视频要转码,这可把她愁坏了。有没有高效转码的方式呢?OSS+函数计算,且看大咖来支招。
|
6月前
|
监控 Java API
设计稳定的微服务系统时不得不考虑的场景
详细介绍了设计一个系统时如何解决流控降级与容错的问题,助于用户提升系统的稳定性。
设计稳定的微服务系统时不得不考虑的场景