数组系列练习二
2016-03-26 20:39
302 查看
题目要求:
返回一个整数数组中最大子数组的和。
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
设计思路:
从尾往头扫描,找出最大值max1,并记录最大位置i,再从头往尾扫描,找出最大值max2, 并记录最大位置j,若i>j,则比较max1+max2与max,求出最大值,若i<=j,则令max = A[0]+A[1]+A[2]+...A[n-1],求出max和MaxSum之间的最大值,即最后比较MaxSum和sum的值。
实验代码:
实验截图:
实验总结:
通过本次实验,我学到了要将抽象的问题具体化,利用不一般的方法去解决问题,在原来的基础上加入首尾相接这个条件要求,动态规划嵌入程序里面。
返回一个整数数组中最大子数组的和。
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
设计思路:
从尾往头扫描,找出最大值max1,并记录最大位置i,再从头往尾扫描,找出最大值max2, 并记录最大位置j,若i>j,则比较max1+max2与max,求出最大值,若i<=j,则令max = A[0]+A[1]+A[2]+...A[n-1],求出max和MaxSum之间的最大值,即最后比较MaxSum和sum的值。
实验代码:
#include<iostream> using namespace std; int FindMaxSum(int A[], int n) { int value; int start, end; //用来保证输入数组正确 if (A == NULL || n <= 1) { cout << "error input" << '\n';//报错,用户提醒 exit(0);//异常退出 } //一个元素的数组 if (n == 1) return A[0]; //从前往后找最大子数组的和 int pos = 0; int CurSum = A[0]; int MaxSum = A[0]; for (int i = 1; i<n; ++i) { if (CurSum <= 0) CurSum = 0; CurSum += A[i]; if (CurSum >= MaxSum) { MaxSum = CurSum; pos = i; } } int pos1 = 0, max1 = A[0]; CurSum = A[0]; for (int i = 1; i <= n - 1; ++i) { CurSum += A[i]; if (CurSum >= max1) { max1 = CurSum; pos1 = i; } } //从后往前找最大子数组的和 CurSum = A[n - 1]; int pos2 = n - 1, max2 = A[n - 1]; for (int j = n - 2; j >= 0; --j) { CurSum += A[j]; if (CurSum >= max2) { max2 = CurSum; pos2 = j; } } //对首尾相接情况的处理 int sum = 0; if (pos1 >= pos2) { for (int i = 0; i<n; ++i) sum += A[i]; } else { for (int i = 0; i <= pos1; ++i) { sum += A[i]; } for (int j = n - 1; j >= pos2; --j) { sum += A[j]; } } int temp = MaxSum>sum ? MaxSum : sum; if (MaxSum == temp) { end = pos; while (temp != 0) { temp -= A[pos--]; } start = ++pos; } else { if (pos1 >= pos2) { start = 0; end = n - 1; } else { end = pos2; start = pos1; } } value = MaxSum>sum ? MaxSum : sum;//比较sum和MaxSum的值 cout << "最大连续子数列的和:"<<value<<endl;//输出和 cout << "最大连续子数列:" << start<<"---"<< end<<endl;//输出位置 } //控制数组的输入引用函数 int main() { int i, n; int A[50]; cout <<"请输入数组的长度:"<< endl; cin >> n; cout << "请依次输入数组中的数:" << endl; for (i = 0; i != n; ++i) cin >> A[i]; FindMaxSum(A, n); }
实验截图:
实验总结:
通过本次实验,我学到了要将抽象的问题具体化,利用不一般的方法去解决问题,在原来的基础上加入首尾相接这个条件要求,动态规划嵌入程序里面。
相关文章推荐
- 数据的特性与关系
- MFC之CSerialPort类双串口发送接收
- 数据字典
- 浙江科技学院第十三届程序设计竞赛 1001:Let's go to play【细心】
- 第四周项目5--用递归方法求解(3)
- MySQL存储引擎--InnoDB
- 消隐
- bzoj4244 邮戳拉力赛 动态规划
- 关联引用的使用方法
- 展示图片的自动和手动切换
- 矩阵快速幂 ZOJ 3497 Mistwald
- 表空间
- 异常处理方法
- json 数组对象 取值
- 常见图表元素
- Android开源库
- 【BZOJ1005】【HNOI2008】明明的烦恼
- Wolfram Mathematic流程控制
- 比较经典的中断串口接收方法
- Java静态内部类,普通内部类的理解