前景介绍:

之前我们一直使用枚举法求和,这是我们的新方法--动态规划。

问题描述:

给定一个整数数组a[0~n],求数组a的子数组,使其元素和为最大。

问题分析:

方法一:可以用普通的方法枚举所有的子数组,然后求出最大的子数组和,时间复杂度为O(n*n)。

方法二:问题描述符合动态规划最优子结构的要求。

设b[i]表示以a[i]结尾 的子数组的最大子段和,即:

b[i]=max{sum(a[j~k])},其中0<=j<=i,j<=k<=i。

因此对于数组a[0~n]的最大字段和为max{b[i]},其中0<=i<n。

在计算b[i]时,可以考虑以下三种情况:

1,b[i] = b[i-1]+a[i],当b[i-1]>0时,这时候的b[i]中包含a[i]。

2,b[i] = a[i],当b[i-1]<=0,这时候以a[i]重新作为b[i]的起点。

3,b[i]不包含a[i]的情况,这种情况在计算b[i]之前已经计算处结果,保存在b[0~i-1]中。最后计算max{b[i]}时会考虑到。

b[i] = max{ b[i-1]+a[i],a[i]}。

而数组a[0~n]则为max{b[i]}。

在实现时,可以省略数组b[i]。实现如下:

 #include <iostream>   using namespace std;   #define N 10    int max_sub_array(int &s,int &e,int * a)   {   int i=0;   int j =0;   int b,start,end;   int sum = 0;   sum = b = a[0];   s = e = start = end = 0;//s和e是整个数组a[0~n]的最大子段的起末位置。start和end是数组a[0~i]的起末位置。  for(i = 1;i<N;i++)   {   if(b>0)   {   b = b + a[i];   end = i;   }   else  {   b = a[i];   start = end = i;   }   if(sum<b)   {   sum = b;   s = start;   e = end;   }   }   return sum;
}   int main()   {   int a[N]={31,-41,59,26,-53,58,97,-93,-23,84};   int start,end;   int sum = max_sub_array(start,end,a);   cout << sum << "  "<<start<< " "<<end<< endl;   }

转载于:https://www.cnblogs.com/liubobo/p/3611534.html

数组最大子数组和(续)之动态规划相关推荐

  1. 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

          首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵 ...

  2. 求一个二维整数数组最大子数组之和,时间复杂度为N^2

    本随笔只由于时间原因,我就只写写思想了   二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想 一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组 ...

  3. 返回一个二维整数数组最大子数组的和

     要求: 1,输入一个二维整形数组,数组里有正数也有负数. 2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和, 3,求所有子数组的和的最大值. 设计思路: 参照一维整数数组求解最大子 ...

  4. 求首位相连一维数组最大子数组的和

    结对成员: 朱少辉:主要负责代码编写 侯涛亮:主要负责程序测试 题目:一个首尾相接的一维整型数组,其中有正有负,求它的最大子数组并返回它的位置. 思路:在求一维子数组的基础上,先输入一个含有N个数的一 ...

  5. 二维数组最大子数组和

    一.实验题目 求一个二维数组中和最大的子数组. 二.实验思路 基于我们第一次合作时求的一位数组最大子数组,加上一层循环来遍历二维数组中的所有子矩阵的情况. 第一步:先利用上次的方法求每一行的情况,将每 ...

  6. 结对开发——一维数组最大子数组判断溢出

    一 题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来 ...

  7. 环状二维数组最大子数组求和

    题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样. n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一 ...

  8. 环形数组最大子数组之和

    题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]--A[j-1]首尾相邻, ...

  9. 求二维数组最大子数组

    结对队友:胡康臻.杨寒寒 1.设计思想: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只 ...

  10. 首尾相连的一位数组最大子数组和

    题目:在原有的一位数组上进行扩展,求首尾相连的最大子数组的和: 要求: 输入一个一维整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和 ...

最新文章

  1. 【论文解读】从BERT和XLNet到MPNet
  2. VC++打开、保存文件对话框和浏览文件夹对话框
  3. php中上传图片怎么显示出来,PHP上传图片类显示缩略图功能
  4. 212. Word Search II:多个单词查找
  5. ROS笔记(26) Movelt!
  6. OpenCV学习2--图片的加载,修改与保存
  7. 中英金融科技论坛:监管科技增长较快 区块链等新技术挑战监管能力
  8. HDU 1260: Tickets
  9. HTML做一个简单漂亮的宠物网页(纯html代码)
  10. html5怎么设置年月日选择框,HTML5文件选择框(各种类型)
  11. 如何使用PS更换证件照背景色
  12. 如何在工作中形成自己的方法论(待完善)
  13. ibmt60升级linux,【原创】老兵不死,T60最强升级记
  14. 将本地图片或者网上图片用post方式上传到图片服务器
  15. AngularJS动态加载Controller
  16. 张量分解-Tucker分解
  17. python和verilog对接_用这个库居然可以使用Python进行FPGA逻辑开发
  18. EtherCAT总线运动控制器应用进阶一
  19. 频谱仪测试gsm信号测试软件,浅谈GSM ORFS输出频谱测试
  20. 字体编辑器BMFont

热门文章

  1. java接口抽象方法_Java接口、接口和抽象类:
  2. python之路day9_Python之路,Day7 - 面向对象编程进阶
  3. 2019蓝桥:2019拆分为平方和问题
  4. Pytorch tensor基础知识
  5. java calendar数组_Java Calendar Date使用总结
  6. 遗传算法之:地图着色
  7. C/C++[算法入门]续
  8. 优先深度搜索判断曲线相交_深度优先搜索(Depth-first search)是如何搜索一张图的?...
  9. mysql自动跑sql发邮件_SQL server 表数据改变触发发送邮件的方法
  10. 2021-08-27最大回文子串 leetcode