/**
* 一维最大字段和问题,约定如果全部元素均是负数,
* 则最大字段和为0(不选任何元素)。
* @author Sking
*/
package 数组问题;
public class 一维最大子段和 {
/**
* 暴力遍历求解最大字段和问题
* 时间复杂度为O(n^3)
* @param a 指定序列
* @return 最大字段和
*/
public static int maxSum0(int[] a){
int n=a.length-1;
int sum=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++){
int thissum=0;
for(int k=i;k<=j;i++)thissum+=a[k];
if(thissum>sum)
sum=thissum;
}
return sum;
}
/**
* 改进的暴力遍历求解最大字段和问题
* 时间复杂度为O(n^2)
* @param a 指定序列
* @return 最大字段和
*/
public static int maxSum1(int[] a) {
int n = a.length - 1;
int sum = 0;
for (int i = 1; i <= n; i++) {
int thissum = 0;
for (int j = i; j <= n; j++) {
thissum += a[j];
if (thissum > sum) {
sum = thissum;
}
}
}
return sum;
}
/**
* 递归分治求最大字段和问题
* 求一个序列的最大字段和可以递归分为左右两个字段分析,
* 分别求左右字段的最大字段和,以及从中间开始向两边伸展
* 的最大字段和,则该序列的最大字段和是它们三者之一。
* 时间复杂度为:O(n*log2(n))
* @param a 指定序列
* @param left 序列的左端索引
* @param right 序列的右端索引
* @return 序列的最大字段和
*/
public static int maxSum2(int[] a,int left, int right) {
int sum = 0;
if (left == right)//只有一个元素
sum = a[left] > 0 ? a[left] : 0;
else {
int center = (left + right) / 2;
//递归求左右字段的最大字段和
int leftsum = maxSum2(a,left, center);
int rightsum = maxSum2(a,center + 1, right);
int s1 = 0;//从中间向左边伸展的最大字段和
int lefts = 0;
for (int i = center; i >= left; i--) {
lefts += a[i];
if (lefts > s1)
s1 = lefts;
}
int s2 = 0;//从中间向右边伸展的最大字段和
int rights = 0;
for (int i = center + 1; i <= right; i++) {
rights += a[i];
if (rights > s2)
s2 = rights;
}
sum = s1 + s2;
if (sum < leftsum)
sum = leftsum;
if (sum < rightsum)
sum = rightsum;
}
return sum;
}
/**
* 动态规划算法求解最大字段和问题:
* 假设(A[i],...,A[n-1])序列的最大字段和为all[i],
* (A[i],...,A[n-1])序列中包含A[i]的最大字段和为start[i],
* 则(A[i-1],A[i],...,A[n-1])序列的最大字段和为:
* max{A[i-1],A[i-1]+start[i],All[i]}.
* 性能:时间复杂度为O(n),辅助空间为2n
* 时间复杂度为:O(n)
* @param a 指定序列
* @return 最大字段和
*/
public int maxSum3(int[] a) {
int len=a.length;
int[] start=new int[len];
int[] all=new int[len];
start[len-1]=a[len-1];
all[len-1]=a[len-1];
for(int i=len-2;i>=0;i--){
start[i]=Math.max(a[i], a[i]+start[i+1]);
all[i]=Math.max(start[i], all[i+1]);
}
return all[0];
}
/**
* 动态规划算法求解最大字段和问题:
* 假设(A[i],...,A[n-1])序列的最大字段和为all[i](存在nAll)
* (A[i],...,A[n-1])序列中包含A[i]的最大字段和为start[i](存在nStart)
* 则(A[i-1],A[i],...,A[n-1])序列的最大字段和为:
* max{A[i-1],A[i-1]+nStart,nAll}.
* 性能:时间复杂度为O(n),辅助空间为2(即O(1))
* 时间复杂度为:O(n)
* @param a 指定序列
* @return 最大字段和
*/
public int maxSum4(int[] a) {
int len=a.length;
int nStart=a[len-1];
int nAll=a[len-1];
for(int i=len-2;i>=0;i--){
nStart=Math.max(a[i], a[i]+nStart);
nAll=Math.max(nStart, nAll);
}
return nAll;
}
/**
* 高效的动态规划求解最大字段和问题
* 时间复杂度为:O(n),辅助空间为2
* @param a 指定序列
* @return 最大字段和
*/
public int maxSum5(int[] a) {
int n = a.length;
int sum = 0;//最大字段和
int b = 0;//当前最大字段和
for (int i = 0; i <n; i++) {
if (b > 0)
b += a[i];
else
b = a[i];
if (b > sum)
sum = b;
}
return sum;
}
}
相关推荐
动态规划法求解最大字段和问题
用动态规划法求解最大字段和问题,DEV C++环境运行,测试可用可进行多组数据测试
最大连续子序列的四种求解方法
第一种:常规的求解算法:使用三层for循环,然后进行比较得到最大值最后进行返回即可 第一层for循环确定开始的子序列的位置 第二次for循环确定结束的子序列的位置 第三层for循环进行求和相加 if判断进行求和比较返回较大的子序列的和package 最大子序列求和方法一;public class MaxSum01 { public static int MaxSum(int[]
动态规划之最大字段和问题
此程序经上机调试,没有错误,下载后在VC++环境下可直接运行,大家交流一下!
最大子矩阵和 [No. 46]
前言: 今天花了很长时间,看了无数人写的帖子,但是几乎没有人把这个问题一下子说得很清楚,所以,我把这个问题按照自己的思路写出来,希望能够把这个问题讲清楚。 问题: 求一个M*N的矩阵的最大子矩阵和。 比如在如下这个矩阵中: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 拥有最大和的子矩阵为: 9 2 -4 1 -1 8 其和为15。 思路...
Orale EBS R12 AP应付模块 发票导入接口(Interface)
ap_interface_groups_s.nextval; ap_invoices_interface_s.nextval; ap_invoice_lines_interface_s.nextval; SELECT * FROM ap_invoices_interface ih; SELECT * FROM ap_invoice_lines_interface il; SELECT * FROM...
CPRI原理及应用--基本原理
本文主要介绍CPRI的基本原理,包括CPRI的发展历程、CPRI基本协议、速率、帧结构、时延模型等
JAVA 算法之穷举法
java算法之穷举法一。什么是穷举法? 在算法中, 穷举算法是最简单的一种算法,其依赖于计算机强大的计算能力,来穷举每一种可能的情况,以达到解决问题的目的 。 穷举法基本思想是逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除 。 哈哈 ,是不是看不懂,这是官方解释。看不懂就对了!! 个人理解为穷举算法就是依靠强大的计算能力 对问题中所有...
3DGS-to-PC实战指南:零代码实现3D高斯场景到点云/Mesh的高效转换
本文详细介绍了3DGS-to-PC工具如何实现3D高斯场景到点云/Mesh的高效转换,无需代码即可完成。通过实战案例和参数调优技巧,帮助用户快速掌握这一开源插件的使用方法,提升3D数据处理效率。特别适合建筑扫描、影视特效等领域的专业人士。
数组操作大全<Java实现>
/** * 数组操作类 * @author Sking */ import java.util.LinkedHashSet; import java.util.Set; public class ArrayUtils { /**1.复制数组*/ //System.arraycopy(from,fromIndex,to,toIndex,count); //Xxx代表long,
408计算机复试专业课问答汇总
408计算机复试专业课问答汇总
使用Docker搭建SearXNG搜索引擎
【代码】使用Docker搭建SearXNG搜索引擎。
2026Java面试 | Java 8、Java 21、Java 25 新特性与 Spring Boot 版本对应指南:JVM 垃圾回收、版本差异与迁移实践
Java面试 | Java 8、Java 21、Java 25 新特性与 Spring Boot 版本对应指南:JVM 垃圾回收、版本差异与迁移实践
【ENVI初学】查看影像空间分辨率及重采样
例如,如果线段长度为900米,对应的像素数量为30个,那么影像的空间分辨率为30米。通过计算长度与像素数量的比值,即可得到影像的空间分辨率。,在弹出的对话框中,输入重采样后输出文件的xy分辨率大小。在测量结果窗口中,可以看到该线段的长度以及角度。在影像上点击并拖动鼠标,绘制一条直线段。工具,选择要重采样的影像后点击ok。,避免了插值过程中光谱信息的改变。:最近邻插值法通过选择原始影像中。在ENVI中打开影像后右键选择。指示了每个像素的地理跨度(聚合为一个新像素,通常通过。方法一:查看影像的元数据。
AI智能旅游推荐系统
该项目展示了Spring Boot与大语言模型(LLM)的集成方案,包含多项核心技术:通过MCP协议实现模型上下文管理,采用RAG架构增强生成效果,运用SSE实现流式响应,结合WebFlux进行响应式编程,并整合向量数据库实现文本向量化检索。项目提供了从AI集成到实时数据推送的完整解决方案,适用于需要智能交互的现代应用场景。
复现Fastjson反序列化漏洞(从dnslog回显到rce再到反弹shell)
Fastjson是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。......
基于Spring Boot 3 + Vue 3 + UniApp的全栈高校社团管理小程序设计与实现
requestMatchers("/api/auth/**", "/doc.html", "/webjars/**", "/v3/api-docs/**").permitAll() // 公开接口。<u-search placeholder="搜索活动" v-model="searchKeyword" @search="loadActivities" :showAction="false"></u-search>R.success("活动创建成功") : R.error("活动创建失败");
SpringBoot面试八股文
Spring Boot 是在 Spring 框架基础上推出的一个快速开发框架。它的核心设计目标是简化 Spring 应用的初始搭建和开发过程,通过**“约定大于配置”的理念,“自动装配、起步依赖(starter)”**等机制,让开发者能够以最少的配置,快速创建一个独立的、生产级别的 Spring 应用程序。简单来说,Spring Boot = Spring 框架 + 自动配置 + 起步依赖 + 内嵌服务器。触发:通过注解(通常包含在中)触发自动配置流程。发现从或文件中加载所有候选的自动配置类。过滤。
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
Spring-AI-2.0-完整教程
本文是一份完整的Spring AI 2.0开发教程,详细介绍了如何基于智谱AI(GLM)平台实现各类AI功能。教程采用"零跳跃"设计理念,每章内容都建立在前一章基础上,确保学习路径自然连贯。 教程主要内容包括: 从基础对话功能开始,逐步实现流式输出、结构化返回、多轮对话记忆 进阶功能:函数调用、视觉理解、文生图、文生视频 核心AI技术:文本向量化、检索增强生成 综合实战:构建北邮智能问答客服系统 部署总结与全链路复盘 技术栈采用最新版本: Java 25 + Spring Boot 4.1.0 Spring
霍尼韦尔SoftMaster使用说明
霍尼韦尔SoftMaster使用说明
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
Java求数组的最大字段和
Java求数组的最大字段和 原问题 给定⼀个数组,求这个数组的连续⼦数组中,最⼤的那⼀段的和。 如数组[-2,1,-3,4,-1,2,1,-5,4] 的⼦段为:[-2,1]、[1,-3,4,-1]、[4,-1,2,1]、…、[-2,1,-3,4,-1,2,1,-5,4],和最⼤的是[4,1,2,1],为6。 ⼦问题 -. 只考虑第⼀个元素,则最⼤⼦段和为其本身 DP[0] = nums[0] -. 考虑前两个元素,最⼤⼦段和为 nums[0],num[1]以及 nums[0] + num[1] 中最
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
动态规划-最大子段和
算法思想:动态规划 实际问题:最大子段和 编写语言:Java 前言 最大子段和有多种解法,暴力破解法是最简单的,但时间复杂度较高,最少需要 O(n^2),未改进的算法为 O(n^3);而且暴力破解这种思路对学习算法是没有帮助的。因此个人并未实现。仅对分治法和动态规划两种思路进行了实现。分治法的解决思路详见分治法-最大子段和,分治法解决最大子段和问题需要的时间复杂度为 O(nlogn),而本篇博...
首尾相连的二维数组的最大子数组
一、设计思路:通过综合求二维数组的最大子数组、求首尾相连的一维数组的最大子数组的算法,得出如下思路:首先将二维数组的子数组上下相加转化成许多一维数组,然后按照求首尾相连的一维数组的算法,遍历一维数组的所有子数组,求出子数组的最大值,即为首尾相连二维数组的子数组的最大值,并且在遍历过程中保留取得最大值的位置,输出二维数组的最大子矩阵。 二、代码: import java.awt.Point;...
最大字段和问题详解
最大字段和求解 思路分析 代码实现 /*简单算法*/ int maxsize(int n,int *a,int& besti,int& bestj) { int sum=0,i,j,k; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { int thissu...
OpenCV阈值类型选择指南:从原理到工业实战
图像二值化是计算机视觉中最基础也最关键的预处理步骤,其本质是通过设定灰度决策边界,将连续色调映射为离散目标掩膜。不同阈值类型对应不同的成像假设与统计逻辑:全局阈值依赖直方图分布特性(如Otsu基于双峰、Triangle适配单峰),自适应阈值则建模局部光照变化,而TRUNC、TOZERO_INV等非标准类型在OCR保真、医学弱信号增强等场景展现出不可替代的技术价值。理解阈值背后的物理意义与鲁棒性约束,远比熟记API参数更重要——它直接决定后续检测、分割、识别模块的稳定性与精度。本文聚焦OpenCV中7类阈值机
首尾相接最大子数组和
#include<iostream> using namespace std; #define Nu 5 int main() { int a[Nu]={1,-2,5,-3,6}; cout<<"随机产生数组为:"; for(int i=0;i<Nu;i++) cout<<a[i...
一维数组的最大子段和
public static int maxSubArray(int a[], int n) { int sum = 0, max = -10; for (int i = 0; i < n; i++) { if (sum > 0) sum += a[i]; //用变量sum记住a[i]和a[i]之前数组元素的和。 else sum = a[i]; if (s
最java大子矩阵和问题_最大子矩阵问题实例解析
问题:求一个M*N的矩阵的最大子矩阵和。比如在如下这个矩阵中:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2拥有最大和的子矩阵为:9 2-4 1-1 8其和为15。思路:首先,这个子矩阵可以是任意大小的,而且起始点也可以在任何地方,所以,要把最大子矩阵找出来,我们要考虑多种情况。假定原始矩阵的行数为M,那么对于子矩阵,它的行数可以是1到M的任何一个数,而且,对于一个K行(K...
2241



被折叠的 条评论
为什么被折叠?



