求数组中的最大子数组1
2016-03-25 22:00
260 查看
题目要求:
(1)输入一个整形数组,数组里有正数也有负数。
(2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
(3)求所有子数组的和的最大值。要求时间复杂度为O(n)
题目实现方法:(1)暴力求解 (2)分治算法 (3)动态规划算法
(3)动态规划算法:
设计思路:
设数组为A[],先求的数组A[0]到A[j]中的最大子数组及最大子数组的和SUM;再根据SUM的值,求得数组A[0]到A[j+1]的最大子数组以及最大子数组的和。按照此步骤,一直求到数组A[]的最后一个数为止。
实验截图:
(1)输入一个整形数组,数组里有正数也有负数。
(2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
(3)求所有子数组的和的最大值。要求时间复杂度为O(n)
题目实现方法:(1)暴力求解 (2)分治算法 (3)动态规划算法
(3)动态规划算法:
设计思路:
设数组为A[],先求的数组A[0]到A[j]中的最大子数组及最大子数组的和SUM;再根据SUM的值,求得数组A[0]到A[j+1]的最大子数组以及最大子数组的和。按照此步骤,一直求到数组A[]的最后一个数为止。
#include<iostream> #include<string> using namespace std; int main() { //动态规划的方法 int intArray[100]; //输入数据的数组 int intNum; //用户输入的数量限制 int intPre; //记录最大子数组中的第一个数的位置 int intAfter; //记录最大子数组中的最后一个数的位置 int intSum; //最大值,记录的是最大子数组的最大值 int intCurSum; //当前最大值 intSum = -65535; intCurSum = 0; intNum = 0; cout << "请输入数组(最大不要超过100个数):" << endl; for (int i = 0; i < 100; i++) { if (cin.peek() == 10) { cin.clear(); break; } cin >> intArray[i]; intNum++; } intPre = 0; //初始化最大子数组的第一个数的位置为0 for (int i = 0; i < intNum; i++) { intCurSum = intCurSum + intArray[i]; if (intCurSum>intSum) { intSum = intCurSum; intAfter = i; } if (intCurSum < 0) { intSum = 0; intCurSum = 0; intPre = i+1; } } cout << "最大的子数组为:"; for (int i = intPre; i <= intAfter; i++) { cout << intArray[i] << " "; } cout << endl; cout << "最大的子数组的和为:" << intSum << endl; return 0; }
实验截图:
相关文章推荐
- jQuery on的用法
- Markdown编辑器攻略——字体,字号,颜色
- 查看mysql安装版本
- 生成的API分析文件太大。我们无法在交付前验证您的API使用信息。这只是通知信息。
- Javaweb实训项目中使用到的ajax
- 虚拟机外网不通的一点解决方法
- 快速排序
- iOS9以后 GDataXMLNode修改方式
- Linux学习笔记<三>
- 数据结构——循环单链表和双向链表
- 数据结构实验之链表九:双向链表
- ListView 适配器BaseAdapter配置
- Trick(十三)—— 数学与函数
- 仿知乎日报列表-加载网络数据
- Ubuntu下的抓包工具tcpdump
- 35. Quartz 2D初探
- tcpdump抓取HTTP包
- Tomcat在Linux上的安装与配置
- The Application does not have a valid signature
- 初探极光推送(一)