动态规划法--求数组中最大子集合的和

2023-11-16

例题:给定一个数组int[] a = {-9,1,3,5,-1,7,-5,3,1};

计算数组中连续的最大和以及出现的位置

 输出:下标1到5位连续的最大和为15


首先看到这种题目,我的第一反应·就是用冒泡排序的思想去做:

public class zuoye{
    public static void main(String[] args){
	int[] a = {-9,1,3,5,-1,7,-5,3,1};
	int max=a[0];
	int tempValue=0;
	int x=0,y=0;
	for(int i=0;i<a.length-1;i++){
	    tempValue=a[i];
	    for(int j=i+1;j<a.length;j++){
		tempValue+=a[j];
		if(max<tempValue){
			max=tempValue;
			x=i;
			y=j;
		}
	    }
	}
	System.out.println(x+" "+y+" "+max);
    }
}

具体过程如图所示一步步往下走

程序运行结果如下图:



后来我觉得用动态规划法做从时间空间复杂度上来说就有明显的区别。

用冒泡排序的思想做,时间复杂度(最坏的情况)为O(n^2

若果用动态规划法要做时间复杂度只有O(n)


首先来说下动态规划法的概念(难以理解,我们还是看下)

动态规划求解的基本步骤:

能采用动态规划求解的问题一般要具有3个性质:

(1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

(2)无后效性:即某阶段的状态一定确立,就不受这个状态以后决策的影响,也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

(3)有重叠子问题:即子问题之间是不独立的,一个字问题在下一阶段的决策中可能被多次使用到(该性质不是动态规划的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

 

动态规划算法有一定自己的模式,一般要经历如下几个步骤:

(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段,在划分阶段注重划分后的阶段一定要是有序或者是可排序的,否则问题就无法求解。

(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

(3)确定决策并写出状态转移方程:因为决策和状态转移方程有着天然的联系。状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以决定了决策,状态转移方程也就可以写出。

但事实上常常是反过来做,根据相邻的两个阶段的状态之间的关系来确定决策方法和转移方程。

(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或者边界条件。

 

动态规划法的基本思想:

将待求解的基本问题分为若干个子问题,按照顺序求解子阶段,前一个问题的解,为后一子问题的求解提供有用的信息。在求解任何问题时,列出各种可能的局部解,通过决策保留那些可能达到最优的局部解,丢弃其他局部解。依次解决各个子问题,最后一个子问题就是初始化的解。

 

动态规划采用的基本办法:

为了节约重复求相同子问题的时间,引入一个数组或者一组变量,不管它们是否对最终解有用,把所有子问题的解存于该数组或者这组变量中。


我觉得最好理解的为上面的基本方法:

/*如果用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f[0...n])。 
我们可以给出如下递归公式求f(i) 
     |-- array[i] 如果i==0或者f(i-1)<0 
f(i)=| 
     |-- f(i-1) + array[i] 如果f(i-1)>0 
这个公式的意义: 
   当以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)小于0时,如果把这个负数和第i个数相加,得到的结果反而不第i个数本身还要小,所以这种情况下最大子数组和是第i个数本身。 
 如果以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)大于0,与第i个数累加就得到了以第i个数结尾的子数组中所有数字的和。 
*/  

public class array {
	public static void main(String[] args){
	int[] array = {-9,1,3,5,-1,7,-5,3,1};
	int len=array.length;
	int[] c=new int[len];//引入一个数组
	int max = -1000;//用来记录数组c[]中的最大值  
	int start = 0;//记录数组中子数组的最大和的开始位置  
	int end = 0;//记录数组中子数组的最大和的结束位置  
	int tmp = 0;//中间变量
	c[0] = array[0];
	for (int i = 1; i < len; ++i)
	{
		if (c[i - 1] > 0)
		{
			c[i] = c[i - 1] + array[i];
		}
		else
		{
			c[i] = array[i];
			tmp = i;
		}
		if (c[i] > max)
		{
			max = c[i];
			start = tmp;
			end = i;
		}
	}
	System.out.println(start+"~"+end+"Max is:"+max);
   }
}
上面代码就是用动态规划法来求解的利用了一个数组C来保存临时产生的值,只用了一层for循环,时间复杂度为O(n)。大大的加快了速度。

结果是一样的,分析过程就由你们自己去分析了^*^....

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划法--求数组中最大子集合的和 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp

随机推荐

  • 将json字符串转换成html,根据json字符串生成Html的一种方式

    文章说明 本文介绍了根据Json串生成Html的一种方式 只是简单实现了文本框 密码框 下拉框 只是觉得好玩才这样做 如果觉得没有任何价值 请忽略 不足指出希望各位大牛指点 后续将根据各位的指点继续完善 功能说明 在左侧输入框中输入Json
  • ue中的经纬高转xyz的问题

    在ue中 做了个地球仪 发现经纬度转地心坐标系老是出问题 后来发现 是转ue时 x y坐标要互换 也对 因为在cesium for unreal中还有一系列ecef转ue的相关函数 即下面的代码中 xy需要互换 在ue中才能正常使用 偏心率
  • 【图解网络协议】面试官:三次握手都不会,回去等通知吧

    文章目录 一 网络基础知识准备 1 OSI七层网络模型总结 2 TCP IP协议总结 3 TCP协议流程 4 UDP协议 5 什么是socket 二 http协议 1 什么是http协议 2 http 1 0 与 http 1 1的区别 3
  • 香农公式简介

    信道容量 指信道中信息无差错传输的最大速率 信道模型中定义了两种广义信道 调制信道和编码信道 调制信道是一种连续信道 可以用连续信道的信道容量来表征 编码信道是一种离散信道 可以用离散信道的信道容量来表征 香农公式 设信道带宽为B 单位为H
  • 五种IO模型(详解+形象例子说明)

    在网络环境下 通俗的讲 将IO分为两步 1 等 2 数据搬迁 如果要想提高IO效率 需要将等的时间降低 五种IO模型包括 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO 其中 前四个被称为同步IO 在介绍五种IO模型时 我会举生
  • 给一个正整数n,求出位数。并按正序输出,逆序输出

    求出位数 思路 通过让给定的正整数n整除10 且每整除一次让统计位数的变量count自增一 返回count得到位数 include
  • 华硕主板固态硬盘不识别_[主板] 开机后无法识别硬盘或SSD的故障排除方式

    1 尝试更新官网最新的BIOS版本 可参考FAQ 华硕EZ Flash 3 介绍 2 在计算机开机后 立刻按压键盘上的 delete 键 在BIOS EZ Mode 页面的 Storage Information 字段 确认是否可以显示所接
  • 使用EasyExcel生成表格并且返回File对象

    通过此方法 可以导出表格并且存入File对象中进行其他的操作 这里通过File来进行异步存储到文件服务器 用于下载中心 public static
  • myeclipse10配置tomcat详细过程

    首先确保你已经成功的安装 了myeclipse10和tomcat 我用的是tomcat6 1 在myeclipse10中添加tomcat 选择属性preferences之后进入配置框 选择servers下的tomcat6 视你自己的版本而定
  • 【翻译】软件表现不佳,未来取决于这种情况的改变

    如果一件事不能永远进行下去 它就不会 赫伯 斯坦法则 科技行业的未来会是什么样子 从现在到2030年 我们所有人面临的挑战不再是我们将如何说服世界 或更直接地说 我们的老板或客户 成为碳零 无论我们是否愿意 这都会到来 我们的新问题是 作为
  • 如何阅读他人的项目源代码程序

    阅读他人的项目源代码步骤 备份并编译运行代码 熟悉项目编程语言的语法和惯例用语 看项目文档 有机会可向项目开发人员请教 自上而下构建项目程序的系统架构 建立系统架构和功能逻辑之间的关联 核心代码重点剖析与注释 调整心态 反复阅读 工欲善其事
  • Vue3只读代理---readonly、isReadonly、shallowReadonly

    readonly 获取一个对象 响应式或纯对象 或 ref 并返回原始代理的只读代理 不能给属性重新赋值 只读代理是递归的 访问的任何嵌套 property 也是只读的
  • springmvc源码学习(二十四)异步请求管理器WebAsyncManager初始化

    目录 前言 一 WebAsyncManager初始化 二 参数的初始化 三 自定义参数 总结 前言 Springmvc的异步执行请求是有异步管理器WebAsyncManager来控制的 一 WebAsyncManager初始化 1 在请求到
  • 大数据--Hadoop环境部署(4)Hadoop集群部署

    Hadoop集群的部署方式分为三种 分别是独立模式 Standalone mode 伪分布式模式 Pseudo Distributed mode 和完全分布式模式 Cluster mode 独立模式和伪分布式模式主要用于学习和调试 完全分布
  • 数据圈最全的数据分析&产品文章合集

    关注公众号 回复 进群 与3万 数据人交流 公众号介绍 一个数据人的自留地 成立于2020年2月25日 目前发表原创300 篇 拥有3万 粉丝 交流群10 个 连载数据产品 数据分析 画像标签 策略算法 运营增长 求职面试等20多个方向的文
  • Spring Boot Kafka - 序列化和反序列化JSON

    文章目录 Spring Boot Kafka 序列化和反序列化JSON 前言 配置JsonSerializer和JsonDeserializer 定义一个Model类 Producer类 Consumer类 Controller类 测试 小
  • EMNLP 2020 Beyond Instructional Videos: Probing for More Diverse Visual-Textual Grounding on YouTube

    动机 从无标签的网络视频中进行预训练已经迅速成为在许多视频待处理任务中实际获得高性能的的手段 通过预测语音内容和自动语音识别 ASR token之间的grounded关系来学习特征 然而 先前的训练前工作仅限于教学录像 作者希望这个领域是相
  • 1.uniapp全局状态管理

    概念 把多个组件之间共享数据抽离出来 通过一个 单例模式 进行管理 工具 具备全局状态管理的库 Vuex 全局状态管理中的库 步骤 1 建立Store文件夹 2 建立index js文件 3 在main js中注册Vue插件 4 测试Vue
  • POI实现word转HTML!呵呵!!!

    那些说POI把word转HTML如何如何完美的人们 copy东copy西 有想过转出来的格式与word不一致么 唉
  • 动态规划法--求数组中最大子集合的和

    例题 给定一个数组int a 9 1 3 5 1 7 5 3 1 计算数组中连续的最大和以及出现的位置 输出 下标1到5位连续的最大和为15 首先看到这种题目 我的第一反应 就是用冒泡排序的思想去做 public class zuoye p