线性动态规划专讲

简介: 线性动态规划专讲

线性规划概念

动态规划的主要特点是状态的推导是按照问题规模 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
|
前端开发 数据可视化 定位技术
百度地图开发:根据指定手绘图纸照片行政区划自定义绘制对应区域边界生成geoJOSN的解决方案
百度地图开发:根据指定手绘图纸照片行政区划自定义绘制对应区域边界生成geoJOSN的解决方案
412 0
百度地图开发:根据指定手绘图纸照片行政区划自定义绘制对应区域边界生成geoJOSN的解决方案
|
6月前
|
5G 语音技术 开发者
短视频批量混剪-经验漫谈
“批量生产”、“快速裂变”和“去重”是制作营销短视频的关键,基于有限数量的基础素材大规模生成指定数量的新视频,是营销短视频创作的常见思路。本篇主要介绍一些经验方法,助您更快更高效地生产优质短视频。
210 0
短视频批量混剪-经验漫谈
|
6月前
|
弹性计算 关系型数据库 应用服务中间件
大咖与小白的日常:手把手教你在阿里云ECS上搭建个人博客
小白的玩摄影的男朋友要做毕业设计,小白想给他搭建一个线上个人展厅。大咖推荐了ECS+WordPress,超快上手!
175 5
大咖与小白的日常:手把手教你在阿里云ECS上搭建个人博客
|
6月前
|
Java 数据库 数据安全/隐私保护
实践教程之快速使用PolarDB-X
PolarDB-X 为了方便用户体验,提供了免费的实验环境,您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验,PolarDB-X 也提供免费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。
188 0
实践教程之快速使用PolarDB-X
|
6月前
|
SQL 算法 关系型数据库
PolarDB-X 热点优化系列 (二):如何支持淘宝大卖家分区热点
本文重点介绍分布式数据库下分区读写热点的相关优化。
PolarDB-X 热点优化系列 (二):如何支持淘宝大卖家分区热点
|
6月前
|
消息中间件 监控 Kubernetes
基于EventBridge HTTP Source构建SaaS应用集成的最佳实践
本文将介绍基于EventBridge HTTP Source构建SaaS应用集成的最佳实践。
116 0
基于EventBridge HTTP Source构建SaaS应用集成的最佳实践
|
6月前
|
人工智能 达摩院 小程序
大咖与小白的日常:一键生成漫画风头像
AI作画火得一塌糊涂,但是好像常常画得很离谱?不如来试试阿里云视觉智能开放平台的人物动漫化API,一键生成一个属于自己的、独一无二的漫画风头像。
139 0
大咖与小白的日常:一键生成漫画风头像
|
6月前
|
移动开发 Kubernetes 测试技术
MSE服务治理最佳实践:基于Ingress-nginx网关实现全链路灰度
微服务架构下,有一些需求开发涉及到微服务调用链路上的多个微服务同时改动。通常每个微服务都会有灰度环境或分组来接受灰度流量。我们希望进入上游灰度环境的流量也能进入下游灰度的环境中,确保1个请求始终在灰度环境中传递。即使这个调用链路上有一些微服务应用不存在灰度环境,那么这些微服务应用在请求下游应用的时候依然能够回到下游应用的灰度环境中。我们通过 MSE 提供的全链路灰度能力,可以在不需要修改任何业务代码的情况下,轻松实现上述所说的全链路灰度能力。
MSE服务治理最佳实践:基于Ingress-nginx网关实现全链路灰度
|
6月前
|
存储 传感器 机器人
创新精密驱动技术,助力企业数字化转型 ——知行驱控一体化柔性自适应末端执行器
近年来,机器人的发展及应用使得高可靠性和高精度的柔性机器人末端的需求也越来越多。现有的末端执行器并不能完全满足多样化的场景需求,灵巧手的售价太高不适合工业领域应用。机器人抓取系统广泛应用在产品装配、仓储物流、检测等领域,因此对机器人末端的灵活度、精确度、柔性有更高的要求。如在大部分电子产品装配还都以...
125 0
创新精密驱动技术,助力企业数字化转型 ——知行驱控一体化柔性自适应末端执行器