动态规划算法(2)--最大子段和与最长公共子序列
目录
一、最大子段和
1、什么是最大子段和
2、暴力枚举
3、分治法
4、动态规划
二、最长公共子序列
1、什么是最长公共子序列
2、暴力枚举法
3、动态规划法
4、完整代码
一、最大子段和
1、什么是最大子段和
子段和就是数组中任意连续的一段序列的和,而最大子段和就是寻找子段和里最大的一个值。下面的解释中S[l,r]会用来表示l到r的子段和,l和r分别表示左值和右值。
最大子段和一般有三种解决方案:暴力枚举法,分治法,动态规划法。下面将逐个介绍。
2、暴力枚举
暴力枚举就是遍历所有的子段和,寻找最大的子段和,时间复杂度 。相对无脑,直接贴上代码。
//暴力枚举法public static int maxsize_violate(ArrayList<Integer>arr,int left, int right){int max=-99999999;for(int i=left;i<=right;i++){int sum=0;for(int j=i;j<=right;j++){for(int k=i;k<=j;k++){sum+=arr.get(k); //最大值来源}if(sum>max)max=sum;sum=0;}}return max;}
3、分治法
将每个问题分解为三个小问题,左一半的子段和,右一半的子段和,(必须)跨区域的子段和。
伪代码如下,可以看到左子段和与右子段和都是递归求解(3、4),跨区域的一定是左右两个子段和最大值的和(5、6、7),最后选择左子段和、右子段和、跨域子段和中最大的子段和(8、9)。
完整代码:
//分治法public static int maxsize(ArrayList<Integer>arr, int left, int right){int sum=0,midSum=0,leftSum=0,rightSum=0;int center,s1,s2,lefts,rights;//左右相等,返回左值if (left==right){ sum=arr.get(left);}//否则,分治法else {center=(left+right)/2;leftSum=maxsize(arr,left,center); //left,l+r/2 //左区间最大值rightSum=maxsize(arr,center+1,right); //l+r/2+1,right //右区间最大值//后面都是在计算跨区域最大值(必须跨区域),一定是左区间贴近边界的最大值加右区间贴近边界的最大值相加。s1=0;lefts=0; //s1存左侧区间最大值,lefts作为tempfor (int i=center;i>=left;i--){lefts+=arr.get(i);if (lefts>s1){s1=lefts;}}s2=0;rights=0; //s2存右侧区间最大值,rights作为temp for (int j=center+1;j<=right;j++){rights+=arr.get(j);if (rights>s2){s2=rights;}}midSum=s1+s2; //中间跨域的等于左侧加右侧的if (midSum<leftSum){sum=leftSum;}else {sum=midSum;}if (sum<rightSum){sum=rightSum;}}return sum;}
4、动态规划
动态规划法是自底向上推导,假设为第i个数,为包含最后一个数的连续子段和,sum为最大子段和。
建立于下面图这个关系,假设已经有到的子段和,那么加入后一个生成只有两种可能:
(1),那么
(2),那么
对于的每一个,都要与sum取最大值,保证sum为到中最大的值,返回sum。
完整代码:
//动态规划法public static int maxsum(ArrayList<Integer>arr, int n){int sum=-999999;int b=0;for(int i=0;i<=n;i++){if(b>0)b+=arr.get(i);else b=arr.get(i);if(b>sum)sum=b;}return sum;}
二、最长公共子序列
1、什么是最长公共子序列
子序列是指序列中任意不一定连续但顺序的若干个字符组成的序列。如下图中Z1={B,C,A}为X的子序列,B,C,A三个字符在X中顺序出现,且不一定连续。
公共子序列就是指两个序列之间存在一个共同的子序列,而我们就是要找到最长的一个公共子序列。
2、暴力枚举法
暴力枚举法,不仅占用了相当大的内存存放所有子序列,和所有公共子序列,而且浪费了巨大的时间,时间复杂度指数级。
3、动态规划法
动态规划法仍然是这种自底向上的算法,讨论前一项的最长公共子序列通过比较两个序列下一个值,判定是否进入子序列。动态规划法的时间复杂度为O(mn)。
使用c[i][j]数组记录和的最长公共子序列长度, b[i][j]数组记录子序列的产生情况。c数组存在下面的递归结构成立,与b数组的关系如下,根据这个递推式,可以写出c和b数组的生成函数。
c[i][j]=c[i-1][j-1]+1 | b[i][j]=1 | ↖ |
c[i][j]=c[i-1][j] | b[i][j]=2 | ↑ |
c[i][j]=c[i][j-1] | b[i][j]=3 | ← |
如何构造最长子序列?
就是根据b数组的指引,倒推子序列,所有b[i][j]=1,也就是b数组指引为左上箭头的,都是公共序列的值,将他们按顺序串接就得到了最大子序列。
注意一个问题,X序列是y轴方向的,Y序列是x轴方向的。
4、完整代码
//最长公共子序列
import java.util.Scanner;
public class LCS {public static void main(String [] args){String x=new Scanner(System.in).nextLine();String y=new Scanner(System.in).nextLine();int m=x.length();int n=y.length();int [][]c=new int[m+1][n+1];int [][]b=new int[m+1][n+1];LCSLength(x, y, c, b);for(int i=0;i<m+1;i++){for(int j=0;j<n+1;j++){System.out.print(c[i][j]);System.out.print("\t");}System.out.println("");}BuildLCS(m,n,x,b);}//最长公共子序列生成c和b数组public static void LCSLength(String x,String y,int [][]c,int [][]b){int i,j;int m=x.length();int n=y.length();for(i=0;i<m+1;i++)c[i][0]=0;for(i=0;i<n+1;i++)c[0][i]=0;for(i=1;i<m+1;i++){for(j=1;j<n+1;j++){if(x.charAt(i-1)==y.charAt(j-1)){c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else if(c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]=2;}else{c[i][j]=c[i][j-1];b[i][j]=3;}}}}//构造最长公共子序列public static void BuildLCS(int i,int j,String x,int[][]b){if(i==0|j==0){return;}if(b[i][j]==1){BuildLCS(i-1, j-1, x, b);System.out.print(x.charAt(i-1));}else if(b[i][j]==2){BuildLCS(i-1,j,x,b);}else{ BuildLCS(i, j-1, x, b);}}
}
相关文章:
动态规划算法(2)--最大子段和与最长公共子序列
目录 一、最大子段和 1、什么是最大子段和 2、暴力枚举 3、分治法 4、动态规划 二、最长公共子序列 1、什么是最长公共子序列 2、暴力枚举法 3、动态规划法 4、完整代码 一、最大子段和 1、什么是最大子段和 子段和就是数组中任意连续的一段序列的和,而…...
CentOS上网卡不显示的问题
文章目录 1.问题描述 1.问题描述 ifconfig下看不到ens33网卡了。systemctl status network #查看网卡状态报下面的问题网上说的解决方式有以下三种: 第一种: 和 NetworkManager 服务有冲突,这个好解决,直接关闭 NetworkManger 服…...
localStorage实现历史记录搜索功能
📝个人主页:爱吃炫迈 💌系列专栏:JavaScript 🧑💻座右铭:道阻且长,行则将至💗 文章目录 为什么使用localStorage如何使用localStorage实现历史记录搜索功能(…...
计算机网络(一):概述
参考引用 计算机网络微课堂-湖科大教书匠计算机网络(第7版)-谢希仁 1. 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水、电、煤气这些基础设施一样,成为我们生活中不可或…...
visual code 下的node.js的hello world
我装好了visual code ,想运行一个node.js 玩玩。也就是运行一个hello world。 一:安装node.js : 我google 安装node.js 就引导我到下载页面:https://nodejs.org/en/download 有 Windows Installer (.msi) 还有Windows Binary (…...
MySQL——四、SQL语句(下篇)
MySQL 一、常见的SQL函数1、数学函数2、日期函数3、分组函数(聚合函数)4、流程控制函数 二、where条件查询和order by排序三、分组统计四、多表关联查询1、交叉连接CROSS2、内连接inner3、外连接:outer4、子查询 五、分页查询 一、常见的SQL函数 1、length(str):获…...
蓝桥杯每日一题2023.10.2
时间显示 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 输入为毫秒,故我们可以先将毫秒转化为秒,由于只需要输出时分,我们只需要将天数去除即可,可以在这里多训练一次天数判断 #include<bits/stdc.h> using namespace std…...
红外遥控器 数据格式,按下及松开判断
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。 同类产品的红…...
win32进程间通信方式(13种)
win32进程间通信 文件映射共享内存匿名管道命名管道远程过程调用(RPC)对象连接与嵌入(OLE)动态数据交换(DDE)剪贴板WM_COPYDATA消息邮件槽其它 文件映射 特点:本地间通信,不能用于网…...
基于Vue+ELement搭建动态树与数据表格实现分页模糊查询
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 …...
多线程案例 - 单例模式
单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…...
云原生Kubernetes:对外服务之 Ingress
目录 一、理论 1.Ingress 2.部署 nginx-ingress-controller(第一种方式) 3.部署 nginx-ingress-controller(第二种方式) 二、实验 1.部署 nginx-ingress-controller(第一种方式) 2.部署 nginx-ingress-controller(第二种方式) 三、问题 1.启动 nginx-ingress-controll…...
Java21 新特性
文章目录 1. 概述2. JDK21 安装与配置3. 新特性3.1 switch模式匹配3.2 字符串模板3.3 顺序集合3.4 记录模式(Record Patterns)3.5 未命名类和实例的main方法(预览版)3.6 虚拟线程 1. 概述 2023年9月19日 ,Oracle 发布了…...
Rest Template 使用
大家好我是苏麟 今天带来Rest Template . spring框架中可以用restTemplate来发送http连接请求, 优点就是方便. Rest Template 使用 Rest Template 使用步骤 /*** RestTemple:* 1.创建RestTemple类并交给IOC容器管理* 2. 发送http请求的类*/ 1.注册RestTemplate对象 SpringB…...
IDEA git操作技巧大全,持续更新中
作者简介 目录 1.创建新项目 2.推拉代码 3.状态标识 5.cherry pick 6.revert 7.squash 8.版本回退 9.合并冲突 1.创建新项目 首先我们在GitHub上创建一个新的项目,然后将这个空项目拉到本地,在本地搭建起一个maven项目的骨架再推上去࿰…...
计算机操作系统 (王道考研)笔记(四)I/O系统
目录 1 I/O1.1 I/O 概念和分类1.1.1 I/O 定义1.1.2 I/O 分类 1.2 I/O控制器1.3 I/O 软件层次结构1.4 I/O 应用程序接口和驱动程序应用接口 1 I/O 1.1 I/O 概念和分类 1.1.1 I/O 定义 BIOS(英文:Basic Input/Output System),即基…...
【Java基础】抽象类和接口的使用
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌 目录 一、抽象类抽象类概念…...
Golang的性能优化
欢迎,学习者们,来到Golang性能优化的令人兴奋的世界!作为开发者,我们都努力创建高效、闪电般快速的应用程序,以提供出色的用户体验。在本文中,我们将探讨优化Golang应用程序性能的基本技巧。所以࿰…...
实现两栏布局的五种方式
本文节选自我的博客:实现两栏布局的五种方式 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖的猫&…...
博物馆门票预约APP的设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
【AI视野·今日Robot 机器人论文速览 第四十四期】Fri, 29 Sep 2023
AI视野今日CS.Robotics 机器人学论文速览 Fri, 29 Sep 2023 Totally 38 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚NCF,基于Neural Contact Fields神经接触场的方法实现有效的外部接触估计和插入操作。 (from FAIR ) 操作插入处理结果&am…...
一维数组和二维数组的使用(char类型)
目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用: 一…...
1.基本概念 进入Java的世界
1.1 Java的工作方式 1.2 Java的程序结构 类存于源文件里面,方法存于类中,语句(statement)存于方法中 源文件(扩展名为.java)带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个类…...
程序在线报刊第一期
文章目录 程序在线报刊第一期排序算法:优化数据处理效率的核心技术回顾区块链技术:去中心化引领数字经济新时代展望AI未来:智能化时代的无限可能 程序在线报刊第一期 排序算法:优化数据处理效率的核心技术 近年来,随…...
k8s 拉取镜像报错 no basic auth credentials
文章目录 [toc]基于现有凭据创建 Secret通过命令行创建 Secretpod 使用指定 secret 认证私有镜像仓库 省流提醒: 本次解决的问题是 docker login 可以正常登录,docker pull 也可以正常拉取镜像,只是 k8s 在启动 pod 的时候,没有指…...
Koa处理请求数据
在开发中,后端接收到请求参数后,需要解析参数。请求分为很多种类型,比如常见的get和post。 请求参数 Koa本身可以解析get请求参数,不能解析post请求参数。例如: router.get(/api/get/userInfo, async (context) >…...
关于浮点数的 fld、fadd、fstp 汇编指令介绍
文章目录 FLDFADDFSTP FLD, FADD 和 FSTP 常在一起出现,用于 float 运算。组合实现浮点数的加载、加法运算和保存 FLD FLD 指令用于将 浮点数 从内存加载到浮点寄存器栈(FPU Stack)中。它的使用方式如下: FLD <源内存地址&g…...
知识图谱小白入门(1):neo4j的安装与CQL的使用
文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG:dbms failed to start 二、CQL语法2.1 CQL语法创建节点查询节点创建关系查询关系2.2 习题 习题答案 序 知识图谱,是一种实体间的信息与关系知识的网状结构,借用图论中点与边的概念…...
一个用java的get请求
java发送一个get请求,请求参数classyanfa,使用Authorization认证,在Request Header里填充Authorization: Bearer {token}进行请求认证,token为:sadagdagdgdgfagfd ,另外在Header里补充App标识,X…...
作为SiteGPT替代品,HelpLook的优势是什么?
在当今快节奏的数字化世界中,企业不断寻求创新方式来简化运营并增强客户体验。由于聊天机器人能够自动化任务、提供快速响应并提供个性化互动,它们在业务运营中的使用变得非常重要。因此,企业越来越意识到像SiteGPT和HelpLook这样高效的聊天机…...
城市建设模拟游戏网站/百度2023免费
根据《mPaaS 服务端核心组件体系概述:移动 API 网关 MGS》,我们已经初步了解 mPaaS 服务端众多组件中移动 API 网关 MGS 的具体架构设计和简介。 本文结合贾岛在 TGO 鲲鹏会举办的「走进蚂蚁金服:双十一背后的蚂蚁金服技术支持」活动现场分享…...
腾讯微博 wordpress/怎么创作自己的网站
这一篇是衔接上一篇的,就是要用ggplot2程序包对PCA和PCoA进行可视化。代码我直接照搬过来了,只是绘图的时候用ggplot函数。ggplot2包实现了一个在R中基于全面一致的语法创建图形时的系统。这提供了在R中画图时经常缺乏的图形创造的一致性并允许我们创建具…...
中小企业网站建设公司/百度做个人简介多少钱
作者 | 银川回民二小点文末“在看”,推荐给朋友导语:当大规模的在线教育铺开,区域教育的决策者急需对当下的实施情况进行把脉,以便做出更加科学的应对措施。一份成熟问卷设计,在此时显得尤为关键,为此&…...
东莞市做网站/发布软文广告
Mysql数据中,使用时,总是会碰见导入和导出情况,所以如何正确的导入导出,非常重要!下面根据工作中用到的方法,会不管补充:导入:直接在Mysql中导入:mysql>use databaseN…...
o2o电商网站建设/年轻人不要做网络销售
初学Node.js后每个人都会最终以node demo.js来运行一个写好的node.js脚本,可是既然身为服务器语言,居然不提供让程序以服务运行的方式,这实在有点让人费解,网上海搜,都是一些折衷的方法,列出来吧࿰…...
公司建设官方网站/武汉seo招聘信息
单例模式 最简单但是也挺困难的。 要保证在一个JVM中只能存在一个实例,要考虑到如下的情况: Java能够使用那些方式构建对象Java在创建对象时多线程并发情况下是否仍然只能创建一个实例Java创建对象的方法: new 最常用的,直接使用…...