数组系列练习二
题目要求:
返回一个整数数组中最大子数组的和。
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组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的值。
实验代码:
1 #include<iostream> 2 using namespace std; 3 int FindMaxSum(int A[], int n) 4 5 { 6 int value; 7 int start, end; 8 //用来保证输入数组正确 9 if (A == NULL || n <= 1) 10 11 { 12 cout << "error input" << '\n';//报错,用户提醒 13 exit(0);//异常退出 14 } 15 //一个元素的数组 16 if (n == 1) 17 return A[0]; 18 //从前往后找最大子数组的和 19 int pos = 0; 20 int CurSum = A[0]; 21 int MaxSum = A[0]; 22 for (int i = 1; i<n; ++i) 23 { 24 if (CurSum <= 0) 25 CurSum = 0; 26 CurSum += A[i]; 27 if (CurSum >= MaxSum) 28 { 29 MaxSum = CurSum; 30 pos = i; 31 } 32 } 33 int pos1 = 0, max1 = A[0]; 34 CurSum = A[0]; 35 for (int i = 1; i <= n - 1; ++i) 36 { 37 CurSum += A[i]; 38 if (CurSum >= max1) 39 { 40 max1 = CurSum; 41 pos1 = i; 42 } 43 } 44 //从后往前找最大子数组的和 45 CurSum = A[n - 1]; 46 int pos2 = n - 1, max2 = A[n - 1]; 47 for (int j = n - 2; j >= 0; --j) 48 { 49 CurSum += A[j]; 50 if (CurSum >= max2) 51 { 52 max2 = CurSum; 53 pos2 = j; 54 } 55 } 56 //对首尾相接情况的处理 57 int sum = 0; 58 if (pos1 >= pos2) 59 { 60 for (int i = 0; i<n; ++i) 61 sum += A[i]; 62 } 63 else 64 { 65 for (int i = 0; i <= pos1; ++i) 66 { 67 sum += A[i]; 68 } 69 for (int j = n - 1; j >= pos2; --j) 70 { 71 sum += A[j]; 72 } 73 } 74 int temp = MaxSum>sum ? MaxSum : sum; 75 if (MaxSum == temp) 76 { 77 end = pos; 78 while (temp != 0) 79 { 80 temp -= A[pos--]; 81 } 82 start = ++pos; 83 } 84 else 85 { 86 if (pos1 >= pos2) 87 { 88 start = 0; 89 end = n - 1; 90 } 91 else 92 { 93 end = pos2; 94 start = pos1; 95 } 96 } 97 value = MaxSum>sum ? MaxSum : sum;//比较sum和MaxSum的值 98 cout << "最大连续子数列的和:"<<value<<endl;//输出和 99 cout << "最大连续子数列:" << start<<"---"<< end<<endl;//输出位置 100 } 101 //控制数组的输入引用函数 102 int main() 103 { 104 int i, n; 105 int A[50]; 106 cout <<"请输入数组的长度:"<< endl; 107 cin >> n; 108 cout << "请依次输入数组中的数:" << endl; 109 for (i = 0; i != n; ++i) 110 cin >> A[i]; 111 FindMaxSum(A, n); 112 113 }
实验截图:
实验总结:
通过本次实验,我学到了要将抽象的问题具体化,利用不一般的方法去解决问题,在原来的基础上加入首尾相接这个条件要求,动态规划嵌入程序里面。
posted on 2016-03-26 20:39 gaga123456 阅读(292) 评论(1) 编辑 收藏 举报