动态规划十大经典问题

动态规划十大经典问题

动态规划十大经典问题 数塔取数问题、矩阵取数问题、最大连续子段和、最长递增子序列、最长公共子序列、最长公共子串、最短编辑距离、背包问题、正整数分组、股票买卖问题。


dp-algorithm

1、数塔取数问题

// 数塔取数问题
public static int dataTowerAccess(int[][] dp) {
    int max = 0;
    for (int i = 1; i < dp.length; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                dp[i][j] = dp[i - 1][j] + dp[i][j];
            } else {
                dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + dp[i][j];
            }
            max = Math.max(dp[i][j], max);
        }
    }
    return max;
}

2、矩阵取数问题

// 矩阵取数问题
public static int matrixAccess(int[][] dp) {
    for (int i = 0; i < dp.length; i++) {
        for (int j = 0; j < dp[i].length; j++) {
            if (i == 0 && j > 0) {
                dp[i][j] = dp[i][j - 1] + dp[i][j];
            }
            if (j == 0 && i > 0) {
                dp[i][j] = dp[i - 1][j] + dp[i][j];
            }
            if (i > 0 && j > 0) {
                dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]) + dp[i][j];
            }
        }
    }
    return dp[dp.length - 1][dp[0].length - 1];
}

3、最大连续子段和

// 最大连续子段和
public static int maxSubSum(int[] dp) {
    int max = dp[1];
    for (int i = 1; i < dp.length; i++) {
        dp[i] += Math.max(dp[i - 1], 0);
        max = Math.max(max, dp[i]);
    }
    return max;
}

4、最长递增子序列

// 最长递增子序列
public static int lis(int[] ints) {
    int[] dp = new int[ints.length];
    int max = 0;
    for (int i = 0; i < dp.length; i++) {
        dp[i] = 1;
        for (int j = 0; j < i; j++) {
            if (ints[j] < ints[i] && dp[j] > dp[i] - 1) {
                dp[i] = dp[j] + 1;
            }
            max = Math.max(dp[i], max);
        }
    }
    return max;
}

5、最长公共子序列

// 最长公共子序列
public static int lcs(char[] a, char[] b) {
    int high = a.length + 1;
    int width = b.length + 1;
    int[][] dp = new int[high][width];
    for (int i = 1; i < high; i++) {
        for (int j = 1; j < width; j++) {
            if (a[i - 1] == b[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
            }
        }
    }
    return dp[high - 1][width - 1];
}

6、最长公共子串

// 最长公共子串
public static int lcs1(char[] a, char[] b) {
    int high = a.length + 1;
    int width = b.length + 1;
    int[][] dp = new int[high][width];
    int max = 0;
    for (int i = 1; i < high; i++) {
        for (int j = 1; j < width; j++) {
            if (a[i - 1] == b[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                max = Math.max(dp[i][j], max);
            }
        }
    }
    return max;
}

7、最短编辑距离

// 最短编辑距离
public static int med(char[] a, char[] b) {
    int high = a.length + 1;
    int width = b.length + 1;
    int[][] dp = new int[high][width];

    for (int i = 0; i < high; i++) {
        dp[i][0] = i;
    }

    for (int j = 0; j < width; j++) {
        dp[0][j] = j;
    }

    for (int i = 1; i < high; i++) {
        for (int j = 1; j < width; j++) {
            if (a[i - 1] == b[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1];
            } else {
                dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i][j - 1], dp[i - 1][j])) + 1;
            }
        }
    }
    return dp[high - 1][width - 1];
}

8、背包问题

// 0-1 背包问题
public static int knapsack(int[] value, int[] weight, int capacity) {
    int high = value.length + 1;
    int width = capacity + 1;
    int[][] dp = new int[high][width];
    for (int i = 1; i < high; i++) {
        for (int j = 1; j < width; j++) {
            if (weight[i - 1] > j) {
                dp[i][j] = dp[i - 1][j];
            } else {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
            }
        }
    }
    return dp[high - 1][width - 1];
}

9、正整数分组

// 正整数分组(多重背包问题)
public static int pig(int[] ints) {
    int sum = 0;
    for (int item : ints) {
        sum += item;
    }
    int high = ints.length + 1;
    int width = sum / 2 + 1;
    int[][] dp = new int[high][width];
    for (int i = 1; i < high; i++) {
        for (int j = 1; j < width; j++) {
            if (ints[i - 1] > j) {
                dp[i][j] = dp[i - 1][j];
            } else {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - ints[i - 1]] + ints[i - 1]);
            }
        }
    }
    return dp[high - 1][width - 1];
}

10、股票买卖问题

// 股票买卖问题
public static int stockTrading(int[] price) {
    if (price.length == 0) {
        return 0;
    }
    int max = 0, minPrice = price[0];
    for (int i = 1; i < price.length; i++) {
        max = Math.max(max, price[i] - minPrice);
        minPrice = Math.min(minPrice, price[i]);
    }
    return max;
}

@XGLLHZ - 陈奕迅 -《我的快乐时代》.mp3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/173799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义类型之结构体

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Javaweb实现数据库简单的增删改查

JDBC介绍 JDBC &#xff08; Java Data Base Connectivity &#xff09; 是一 种 Java 访问 数据库 的技术&#xff0c;它提供 执行 SQL 语句的 Java API &#xff0c;由 一组 类 和接口组成&#xff0c;可以为 不同的 数据库提供统一访问 JDBC工作原理 JDBC应用编程 1、准备…

北醒携全球首款256线车规量产激光雷达亮相广州国际车展

11月17日&#xff0c;北醒携全球首款256线车规量产激光雷达亮相广州国际车展。在车展期间&#xff0c;北醒还公布了与广州花都区人民政府达成投资合作&#xff0c;获滴滴自动驾驶投资以及与捷普联合打造的全球首条量产256线级别车规激光雷达的生产线即将贯通的等多条利好信息&a…

快时尚品牌Halara登上TikTok美国小店榜Top 5,运动健身风靡TikTok

TikTok Shop美国电商数据周榜&#xff08;11/06-12&#xff09;已出&#xff0c;具体信息如下&#xff1a; 上周总GMV达到5850万美元&#xff0c;日均出单840万美元&#xff1b;单日出单最高达2110万美元&#xff0c;是当前美国单日最高销售额&#xff1b; 截至11月12日&…

Postman接口测试 —— 设置断言和集合运行

一、常见的5种断言方法 Postman是一款非常强大的API接口调式工具&#xff0c;它自带断言方法&#xff0c;不需要学习JavaScript脚本&#xff0c;非常方便。 &#xff08;1&#xff09;Status code&#xff1a;Code is 200(校验接口返回结果的状态码) &#xff08;2&#xff09…

轻松答题:用Python编写网页自动答题脚本助你高分通过

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 解释器 Pycharm 编辑器 模块使用: from selenium import webdriver —> 自动测试模块 pip install selenium3.141.0 <指定版本安…

Apache DolphinScheduler 3.0.0 升级到 3.1.8 教程

安装部署的流程可参考官网的文档 Version 3.1.8/部署指南/伪集群部署(Pseudo-Cluster) https://dolphinscheduler.apache.org/zh-cn/docs/3.1.8/guide/installation/pseudo-cluster 本文开始之前&#xff0c;我先补充说明一下升级 Apache DolphinScheduler 的几个关键点 元数…

C++——异常

作者&#xff1a;几冬雪来 时间&#xff1a;2023年11月21日 内容&#xff1a;C板块异常讲解 目录 前言&#xff1a; 异常&#xff1a; C语言传统处理错误的方式&#xff1a; 捕获异常&#xff1a; 异常的相关特性&#xff1a; string与抛异常: catch(...)&#xff1a; …

Monoxide relay机制和连弩挖矿

这篇文章就两个点&#xff0c;relay机制 、 连弩挖矿 relay 最终原子性 Eventual Atomicity 一笔跨链交易&#xff0c;从取款shard中发出&#xff0c;到存款shard中. 当收款shard中将这笔夸片交易打包上链后&#xff0c;原子性才执行结束。 这样做的延迟是比较小的。 如何应…

基于单片机的空气质量实时监测系统(论文+源码)

1. 系统设计 通过文献和市场调查&#xff0c;本设计的实现方案框架是以单片机为核心控制处理器搭建外围的功能模块如温度传感器模块、湿度传感器检测模块、二氧化碳传感器检测设备模块、无线通信模块和蜂鸣器声光报警提示模块来实现&#xff0c;辅以显示模块来展示。 该系统通…

什么是神经网络(Neural Network,NN)

1 定义 神经网络是一种模拟人类大脑工作方式的计算模型&#xff0c;它是深度学习和机器学习领域的基础。神经网络由大量的节点&#xff08;或称为“神经元”&#xff09;组成&#xff0c;这些节点在网络中相互连接&#xff0c;可以处理复杂的数据输入&#xff0c;执行各种任务…

Find My自行车|苹果Find My技术与自行车结合,智能防丢,全球定位

自行车&#xff0c;这项古老而简单的交通工具&#xff0c;近年来在中国经历了一场令人瞩目的复兴。从城市的街头巷尾到乡村的田园小路&#xff0c;自行车成了一种新的生活方式&#xff0c;一个绿色出行的选择。中国的自行车保有量超过两亿辆&#xff0c;但是自行车丢失事件还是…

为什么需要MuleSoft?如何与Salesforce协同工作?

MuleSoft通过一个集成平台将应用程序及其数据(跨云和内部云)连接起来。这被称为iPaaS&#xff0c;可将云应用程序相互集成&#xff0c;以及与本地和传统应用程序集成。 MuleSoft非常适合希望过渡到云的组织&#xff0c;提供了一种强大的集成解决方案。随着组织越来越依赖云及其…

赞评论收藏分享格雷希尔用于机器手抓取的G80P系列自动化螺纹快速接头的应用领域

格雷希尔GripSeal快速密封连接器针对螺纹孔的快速密封有二种操作方式&#xff0c;手动操作和气压驱动;但随着科技的不断发展&#xff0c;机器手越来越多的代替人工在工位上操作&#xff0c;于是我们又研发出适用于机器手抓取的G80P系列自动化螺纹快速连接器&#xff0c;使用机器…

「MobileNet V3」70 个犬种的图片分类

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

C 语言获取文件绝对路径

示例代码 1&#xff0c;不包含根目录绝对路径&#xff1a; #include <stdlib.h> #include <stdio.h>int main(void) {char *fileName "/Dev/test.txt";char *abs_path _fullpath(NULL, fileName, 0);printf("The absolute path is: %s\n", a…

【JavaEE初阶】 JavaScript基础语法——贰

文章目录 &#x1f332;条件语句&#x1f6a9;if 语句&#x1f6a9;三元表达式&#x1f6a9;switch&#x1f6a9;循环语句&#x1f388;while 循环&#x1f388;continue&#x1f388;break&#x1f388;for 循环 &#x1f340;数组&#x1f6a9;创建数组&#x1f6a9;获取数组…

2014年2月24日 Go生态洞察:FOSDEM 2014上的Go演讲精选

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【教程】cpp转python Nanobind 实践 加速轻量版 pythonbind11

主要是尝试一下把c这边的函数封装打包给python用&#xff0c;选择nanobind的原因是&#xff1a;1. 优化速度快&#xff0c;2. 生成二进制包小&#xff0c;不过pythonbind11是更为广泛知道的&#xff0c;nanobind也是pythonbind11作者后续做的&#xff0c;可以查看作者写的 why …

多项式求和

题目描述 给定程序中 fun 函数的功能是&#xff1a;求出以下分数序列的前 n 项之和&#xff0c;并通过函数值返回 main 函数。 输入格式 输入参数。 输出格式 计算公式返回的结果。 输入输出样例 输入1 5 输出1 8.391667 python解&#xff1a; def fun(n):a1b2s0for…