算法设计与分析———动态规划———最大子段和

问题描述:
最大子段和问题是将一个n个整数的序列a[1],a[2]….a[n]中字段a[first]….a[last]之和,(1<=first<=last<=n)求这些子段和中最大的。
例如(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20,子段为a[2],a[3],a[4]。

求解方法:
如果不会算法,那就用时间复杂度为O(n^3)的枚举,i为从1到n的起点,j为从i到n的终点,k为从i到j的子段之和。
还是枚举,改进一下,得到O(n^2)的枚举算法,就是将k去掉,在找其终点j的时候就将子段和记录下来,因为从i到j的子段和就是从i到j-1的子段和加上a[j]。
再改进一下,将这个序列分成1到(1+n)/2的序列与(1+n)/2到n的序列。那么最大的子段有可能出现在:
1.左侧序列。2.右侧序列。3.跨越中间点的序列。
我们从中间点两侧找最大子段,再找越过中间点的最大子段,就形成了我们所说的分治算法,得到复杂度为O(nlogn)的算法。
其实,我们在选择一个元素a[j]的时候,只有两种情况,将a[i]至a[j-1]加上,或者从a[j]以j为起点开始。我们用一个数组dp[i]表示以i为结束的最大子段和,对于每一个a[i],加上dp[i-1]成为子段,或以a[i]开始成为新段的起点。因为我们只需要记录dp值,所以复杂度是O(n)。
这就是最大子段和的动态规划算法。
我们甚至不需要dp数组,只需要定义一个dp变量,因为最后要求的dp值也是最大的,所以我们可以在求dp的时候更新为最大的。

暴力法:

#include<iostream>
using namespace std;int MaxSum(int n,int *a,int &besti,int &bestj)
{int sum=0;for(int i=0;i<n;i++){for(int j=i;j<n;j++){int tempSum=0;for(int k=i;k<j;k++){tempSum+=a[k];if(tempSum>sum){sum=tempSum;besti=i;bestj=j;}}}}return sum;
}
int main()
{int a[100]={-2,11,-4,13,-5,-2};int n=6;int besti=0;int bestj=0;MaxSum(n,a,besti,bestj);cout<<"输出最大子段和:";for(int i=besti;i<bestj;i++){cout<<a[i]<<" ";}} 

暴力法改进:

#include<iostream>
using namespace std;int MaxSum(int n,int *a,int &besti,int &bestj)
{int sum=0;for(int i=0;i<n;i++){int tempSum=0;for(int j=i;j<n;j++){tempSum+=a[j];if(tempSum>sum){sum=tempSum;besti=i;bestj=j;}}}return sum;
}
int main()
{int a[100]={-2,11,-4,13,-5,-2};int n=6;int besti=0;int bestj=0;MaxSum(n,a,besti,bestj);for(int i=besti;i<=bestj;i++){cout<<a[i]<<" ";}} 

动态规划:

#include<iostream>
using namespace std;int MaxSum(int n,int *a,int &besti,int &bestj)
{int sum=0;int tempSum=0;for(int i=0;i<n;i++){if(tempSum>0){tempSum+=a[i];}else{tempSum=a[i];}if(tempSum>sum){sum=tempSum;}} return sum;
}
int main()
{int a[100]={-2,11,-4,13,-5,-2};int n=6;int besti=0;int bestj=0;cout<<MaxSum(n,a,besti,bestj);} 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python2中的unicode_在python 3和2中工作的Unicode文字

So I have a python script that Id prefer worked on python 3.2 and 2.7 just for convenience.Is there a way to have unicode literals that work in both? E.g.#coding: utf-8whatever שלוםThe above code would require a unicode string in python 2.x (u) and i…

Docker Vs Podman

翻译自 Chetansingh 2020年4月24日的博文《Docker Vs Podman》 [1]容器化的一场全新革命是从 Docker 开始的&#xff0c;Docker 的守护进程管理着所有的事情&#xff0c;并成为最受欢迎和广泛使用的容器管理系统之一。但是&#xff0c;请稍等&#xff01;您真的会假设 Docker 是…

算法设计与分析——动态规划——01背包问题

#include<iostream> #include<iomanip> using namespace std; //前i个物品装入容量为j的背包中获得的最大价值//0-1背包动态规划算法 构造二维表 int knapsack_problem( int n,int *weight,int *value,int capacity,int **m,int *flag) {for(int i0;i<capaci…

python量化常用_Python量化常用函数

#-*- coding: utf-8 -*-#Author: fangbei#Date: 2017-08-26#Original:price_str 30.14, 29.58, 26.36, 32.56, 32.82price_str price_str.replace( , ) #删除空格price_array price_str.split(,) #转成数组date_array[]date_base 20170118# for 循环for _ in range(0, len(pri…

让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案

当我们为基于 .NET Framework 的 WinForm 程序增加 CefSharp.WinForms 依赖后&#xff0c;可能会遇到以下报错信息&#xff1a;CefSharp.Common is unable to proceeed as your current Platform is ‘AnyCPU’. To target AnyCPU please read https://github.com/cefsharp/Cef…

算法设计与分析——贪心算法——活动安排问题

问题描述&#xff1a;设有n个活动的集合E{1,2,…,n}&#xff0c;其中每个活动都要求使用同一资源&#xff0c;如演讲会场等&#xff0c;而在同一时间内只有一个活动能使用这一资源。 每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi 。 如果选择了活动…

如何使用 C# 中的 Action, Func,Predicate

译文链接&#xff1a;https://www.infoworld.com/article/3057152/how-to-work-with-action-func-and-predicate-delegates-in-csharp.html?nsdrtrue委托是一个类型安全的函数指针&#xff0c;它可以引用与委托具有相同签名的方法。委托常用于实现回调方法或者事件机制&#x…

python求解微分方程组_python – SymPy / SciPy:求解具有不同变量的常微分方程组...

我是SymPy和Python的新手,我目前正在使用Python 2.7和SymPy 0.7.5,其目标是&#xff1a;a)从文本文件中读取微分方程组b)解决系统问题我已经阅读了this question和this other question,它们几乎就是我要找的,但我还有一个额外的问题&#xff1a;我事先并不知道方程组的形式,所以…

c语言——刷新控制台界面与返回上一级

#include<iostream> #include<stdlib.h> using namespace std;int main() {while(1){system("cls");//刷新控制台程序界面 cout<<"请输入1&#xff1a;进入下一级程序A:"<<endl;cout<<"请输入2&#xff1a;进入下一级程…

C# :异步编程的注意点

在上一篇《C#&#xff1a;异步编程中的 async 和 await》 中简单介绍了在 C# 中的异步编程以及 async 和 await 编程模型&#xff0c;本文介绍下异步编程的注意事项&#xff0c;主要有以下几个方面。同步中调用异步在同步代码中调用异步代码&#xff0c;容易导致死锁&#xff0…

makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑

今天折腾了好久&#xff0c;就为了debug两个makefile的bug。虽然最后找到原因了&#xff0c;但是&#xff0c;怎么说呢&#xff0c;用现在流行的话来说&#xff0c;实在是意难平啊&#xff01;必须写一篇记录一下&#xff01;第一个问题&#xff0c;是个语法高亮问题。今天观察…

算法设计与分析——贪心算法——背包问题

0-1背包问题&#xff1a; 前提&#xff1a;给定n种物品和一个背包。物品i的重量是Wi&#xff0c;其价值为Vi&#xff0c;背包的容量为C。 问题&#xff1a;应如何选择装入背包的物品&#xff0c;使得装入背包中物品的总价值最大? 背包问题&#xff1a; 与0-1背包问题类似&…

python函数模块化教程_【软件测试教程】Python模块化以及内置模块的使用

一&#xff1a;什么是模块模块是一个包含所有你定义的函数和变量的文件&#xff0c;其后缀名是.py。模块可以被别的程序引入&#xff0c;以使用该模块中的函数等功能。二&#xff1a;模块类型1&#xff1a;自定义模块由编程人员自己写的模块。自定义模块时要注意命名&#xff0…

企业级精致 Blazor 套件 BootstrapBlazor 介绍

BootstrapBlazor1、前言 Blazor 作为一种 Web 开发的新技术已经发展有一段时间了&#xff0c;有些人标称 无 JS 无 TS&#xff0c;我觉得有点误导新人的意味&#xff0c;也有人文章大肆宣传 Blazor 是 JavaScript 的终结者&#xff0c;是为了替代 JavaScript 而生的&#xff0c…

算法设计与分析——贪心算法——最优装载问题

有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下&#xff0c;将尽可能多的集装箱装上轮船。 #include<iostream> #include<algorithm> #include<cstring> using namespace std;typedef str…

AgileConfig-轻量级配置中心 1.1.0 发布,支持应用间配置继承

AgileConfig轻量级配置中心自第一个版本发布不知不觉已经半年了。在并未进行什么推广的情况下收到了250个star&#xff0c;对我有很大的鼓舞&#xff0c;并且也有不少同学试用&#xff0c;并且给出了宝贵的意见&#xff0c;非常感谢他们。其中有一些意见非常好&#xff0c;但是…

python getopt模块_python之getopt模块使用

实用方向&#xff1a;处理命令行参数的一个方法&#xff0c;简单好用。方法&#xff1a;getopt模块总共有2个函数&#xff0c;分别为&#xff1a;getopt.getoptgetopt.gnu_getopt简单使用&#xff1a;getopt这个函数常用&#xff0c;简单看一下这个函数的使用&#xff1a;getop…

算法设计与分析——贪心算法——多机调度问题

该类问题可以使用贪心策略可以设计出较好的近似算法&#xff08;并不是最优解&#xff09; #include<stdio.h> #include<stdlib.h> #include<iostream> #include<algorithm> using namespace std;typedef struct Node {int hour;//记录该作业的所需要…

如何在 C# 中使用 Dapper ORM

译文链接&#xff1a;https://www.infoworld.com/article/3025784/how-to-use-the-dapper-orm-in-c.html?nsdrtrue对象关系映射&#xff08;ORM&#xff09;这个概念已经存在很长时间了&#xff0c;ORM的作用就是用来解决 编程领域的 object model 和关系数据库中的 data mode…

从像素坐标到相机坐标_鱼眼相机模型EUCM(一)

前言相较于普通的针孔相机&#xff0c;鱼眼相机的能够观测到的范围更广&#xff0c;在一定程度上其实是可以增强视觉的鲁棒性的。针对于鱼眼相机的模型其实有挺多的&#xff0c;也有论文对这些模型进行了评测&#xff0c;但对于本人来说&#xff0c;最熟知的还是针孔模型&#…