数组系列练习二

题目要求:

返回一个整数数组中最大子数组的和。

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组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  阅读(283)  评论(1编辑  收藏  举报

导航