当前位置: 首页 > news >正文

动态规划算法(2)--最大子段和与最长公共子序列

目录

一、最大子段和

1、什么是最大子段和

2、暴力枚举

3、分治法

4、动态规划

二、最长公共子序列

1、什么是最长公共子序列

2、暴力枚举法

3、动态规划法

4、完整代码 


 

一、最大子段和

1、什么是最大子段和

        子段和就是数组中任意连续的一段序列的和,而最大子段和就是寻找子段和里最大的一个值。下面的解释中S[l,r]会用来表示l到r的子段和,l和r分别表示左值和右值。

        最大子段和一般有三种解决方案:暴力枚举法分治法动态规划法。下面将逐个介绍。

758a27854af049a2a71061694f22f443.png

2、暴力枚举

        暴力枚举就是遍历所有的子段和,寻找最大的子段和,时间复杂度eq?O%28n%5E3%29 。相对无脑,直接贴上代码。

    //暴力枚举法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)。

52b99b166ac14860a4ebc9626c2891af.png

        完整代码:

    //分治法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、动态规划

        动态规划法是自底向上推导,假设eq?a_i为第i个数,eq?b_i为包含最后一个数eq?a_i的连续子段和,sum为最大子段和。

        建立于下面图这个关系,假设已经有eq?a_ieq?a_%7Bj-1%7D的子段和eq?b_%7Bj-1%7D,那么加入后一个eq?a_j生成eq?b_j只有两种可能:

(1)eq?b_%7Bj-1%7D%5Cleqslant%200,那么eq?b_j%3Da_j

(2)eq?b_%7Bj-1%7D%3E0,那么eq?b_j%3Db_%7Bj-1%7D&plus;a_j

        对于eq?1%5Cleqslant%20j%5Cleqslant%20n的每一个eq?b_j,都要与sum取最大值,保证sum为eq?b_1eq?b_j中最大的值,返回sum。

5728b43fe8a94a65a0115e6a832184b9.png

        完整代码: 

    //动态规划法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中顺序出现,且不一定连续。

        公共子序列就是指两个序列之间存在一个共同的子序列,而我们就是要找到最长的一个公共子序列。

9afd433e7cc5406bb74eed774fad9691.png

2、暴力枚举法

        暴力枚举法,不仅占用了相当大的内存存放所有子序列,和所有公共子序列,而且浪费了巨大的时间,时间复杂度指数级eq?O%28n2%5Em%29

fd264a432b4541b988ab67a2838ec25e.png

3、动态规划法

        动态规划法仍然是这种自底向上的算法,讨论前一项的最长公共子序列通过比较两个序列下一个值,判定是否进入子序列。动态规划法的时间复杂度为O(mn)

554b804b5a8344cbb0c62269cd2029cf.png

        使用c[i][j]数组记录eq?x_jeq?y_j的最长公共子序列长度, b[i][j]数组记录子序列的产生情况。c数组存在下面的递归结构成立,与b数组的关系如下,根据这个递推式,可以写出c和b数组的生成函数。

9e797ea0c8e84be5a0f1caeffb7a2336.png

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数组指引为左上箭头的,都是公共序列的值,将他们按顺序串接就得到了最大子序列。

cdd4e6e80b68495583118cc6db6aeb6c.png

        注意一个问题,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、什么是最大子段和 子段和就是数组中任意连续的一段序列的和&#xff0c;而…...

CentOS上网卡不显示的问题

文章目录 1.问题描述 1.问题描述 ifconfig下看不到ens33网卡了。systemctl status network #查看网卡状态报下面的问题网上说的解决方式有以下三种&#xff1a; 第一种&#xff1a; 和 NetworkManager 服务有冲突&#xff0c;这个好解决&#xff0c;直接关闭 NetworkManger 服…...

localStorage实现历史记录搜索功能

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;JavaScript &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 为什么使用localStorage如何使用localStorage实现历史记录搜索功能&#xff08…...

计算机网络(一):概述

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或…...

visual code 下的node.js的hello world

我装好了visual code &#xff0c;想运行一个node.js 玩玩。也就是运行一个hello world。 一&#xff1a;安装node.js &#xff1a; 我google 安装node.js 就引导我到下载页面&#xff1a;https://nodejs.org/en/download 有 Windows Installer (.msi) 还有Windows Binary (…...

MySQL——四、SQL语句(下篇)

MySQL 一、常见的SQL函数1、数学函数2、日期函数3、分组函数(聚合函数)4、流程控制函数 二、where条件查询和order by排序三、分组统计四、多表关联查询1、交叉连接CROSS2、内连接inner3、外连接&#xff1a;outer4、子查询 五、分页查询 一、常见的SQL函数 1、length(str):获…...

蓝桥杯每日一题2023.10.2

时间显示 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 输入为毫秒&#xff0c;故我们可以先将毫秒转化为秒&#xff0c;由于只需要输出时分&#xff0c;我们只需要将天数去除即可&#xff0c;可以在这里多训练一次天数判断 #include<bits/stdc.h> using namespace std…...

红外遥控器 数据格式,按下及松开判断

红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是家用电器广泛采用&#xff0c;并越来越多的应用到计算机系统中。 同类产品的红…...

win32进程间通信方式(13种)

win32进程间通信 文件映射共享内存匿名管道命名管道远程过程调用&#xff08;RPC&#xff09;对象连接与嵌入&#xff08;OLE&#xff09;动态数据交换&#xff08;DDE&#xff09;剪贴板WM_COPYDATA消息邮件槽其它 文件映射 特点&#xff1a;本地间通信&#xff0c;不能用于网…...

基于Vue+ELement搭建动态树与数据表格实现分页模糊查询

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…...

多线程案例 - 单例模式

单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…...

云原生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 记录模式&#xff08;Record Patterns&#xff09;3.5 未命名类和实例的main方法&#xff08;预览版&#xff09;3.6 虚拟线程 1. 概述 2023年9月19日 &#xff0c;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上创建一个新的项目&#xff0c;然后将这个空项目拉到本地&#xff0c;在本地搭建起一个maven项目的骨架再推上去&#xff0…...

计算机操作系统 (王道考研)笔记(四)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&#xff08;英文&#xff1a;Basic Input/Output System&#xff09;&#xff0c;即基…...

【Java基础】抽象类和接口的使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、抽象类抽象类概念…...

Golang的性能优化

欢迎&#xff0c;学习者们&#xff0c;来到Golang性能优化的令人兴奋的世界&#xff01;作为开发者&#xff0c;我们都努力创建高效、闪电般快速的应用程序&#xff0c;以提供出色的用户体验。在本文中&#xff0c;我们将探讨优化Golang应用程序性能的基本技巧。所以&#xff0…...

实现两栏布局的五种方式

本文节选自我的博客&#xff1a;实现两栏布局的五种方式 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是MilesChen&#xff0c;偏前端的全栈开发者。&#x1f4dd; CSDN主页&#xff1a;爱吃糖的猫&#x1f525;&#x1f4e3; 我的博客&#xff1a;爱吃糖的猫&…...

博物馆门票预约APP的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

2篇3章3节:Trae 的高效小说创作与文件管理实操

在人工智能辅助小说创作的过程中,工具操作方式、内容生成逻辑与文件管理体系,直接决定写作效率与文稿质量。Trae作为适配小说创作的专业工具,不仅支持单章、全章智能化生成正文内容,适配短篇、长篇不同创作场景,还具备多屏拆分、标签页管理、规范化文件收纳等实用功能。熟…...

从惊叹到依赖:软件定义时代的技术信任与实用指南

1. 从“惊叹”到“依赖”&#xff1a;我们与技术关系的深度剖析“这玩意儿以前没有的时候&#xff0c;我们是怎么活过来的&#xff1f;” 这念头时不时就会冒出来。我能看懂纸质地图&#xff0c;甚至开车时有时觉得它比谷歌地图更靠谱&#xff1b;我也记得在厚厚的黄页里翻找电…...

算法将驱动一切:边缘AI智能体如何重塑智能系统

仓库装卸区的安全摄像头每天采集86400秒的视频数据。长途卡车上的车队远程信息记录仪在两次加油之间积累了数GB的行车影像。外科手术机器人的立体摄像头以每秒60帧的速度生成密集点云。所有这些数据都产生于数字世界与现实世界的交界处&#xff0c;但几乎没有任何一条被用于智能…...

Notero终极指南:打通Zotero与Notion的学术工作流桥梁

Notero终极指南&#xff1a;打通Zotero与Notion的学术工作流桥梁 【免费下载链接】notero A Zotero plugin for syncing items and notes into Notion 项目地址: https://gitcode.com/gh_mirrors/no/notero 当你在Zotero中积累了数百篇文献&#xff0c;却发现整理和引用它…...

阵列天线方向图综合算法与应用【附代码】

✨ 长期致力于方向图综合算法、交替投影迭代、交替方向乘子法、子阵方向图综合、相控阵系统、软件设计研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09…...

Lumi Diary:基于OpenClaw Skill的本地AI记忆伴侣设计与实践

1. 项目概述&#xff1a;一个住在你设备里的记忆精灵如果你和我一样&#xff0c;对把生活点滴交给云端总有点不放心&#xff0c;但又渴望有一个能懂你、能帮你把碎片记忆编织成故事的伙伴&#xff0c;那么 Lumi Diary 的出现&#xff0c;可能正是时候。这不是又一个需要你手动打…...

Python网络爬虫实战:构建自动化招聘信息聚合工具JobClaw

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫 JobClaw。这名字起得挺形象&#xff0c;“Claw”是爪子的意思&#xff0c;合起来就是“工作抓取器”。简单来说&#xff0c;它是一个帮你从各大招聘网站上自动抓取、聚合和分析职位信息的工具。对于正在找…...

2026年项目管理工具测评:10款主流软件对比与企业选型建议

本文测评 ONES、Tower、Jira、Asana、monday、ClickUp、Notion、Trello、Microsoft Project、Smartsheet 十款项目管理工具&#xff0c;帮助选型人员从组织规模、项目复杂度、协作方式与治理需求出发&#xff0c;判断哪类项目管理工具更适合自身团队。一、10款项目管理工具速览…...

告别‘纸片人’:在Unity URP里给角色注入灵魂——皮肤透光、发丝细节与眼神光的调校指南

告别‘纸片人’&#xff1a;在Unity URP里给角色注入灵魂——皮肤透光、发丝细节与眼神光的调校指南 在独立游戏开发中&#xff0c;角色往往是玩家情感投射的核心载体。一个缺乏生命力的角色模型&#xff0c;即使建模精度再高&#xff0c;也会让玩家产生"纸片人"的疏…...

策略梯度定理实战解析:从蒙特卡洛回报到PyTorch梯度实现

1. 这不是数学课&#xff0c;是写给实战者的政策梯度定理手记你打开这篇文字的时候&#xff0c;大概率正卡在某个强化学习项目里&#xff1a;模型跑不通、梯度爆炸、训练曲线像心电图一样乱跳&#xff0c;或者更糟——明明代码和论文一模一样&#xff0c;但 reward 就是上不去。…...