zoukankan      html  css  js  c++  java
  • 数组系列练习二

    题目要求:

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

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

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

    如果数组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" << '
    ';//报错,用户提醒
     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 }

    实验截图:

    实验总结:

    通过本次实验,我学到了要将抽象的问题具体化,利用不一般的方法去解决问题,在原来的基础上加入首尾相接这个条件要求,动态规划嵌入程序里面。

  • 相关阅读:
    Geogebra指令
    大表修改表结构
    mongodb获取配置参数getParameter
    mysql的binlog增量日志解析,提供增量数据订阅和消费
    chaosblade-exec-os项目的burnio.go文件解读
    mysql的where条件中的字段不要加函数
    mysql释放大表空间的正确之道
    mysql服务器问题
    purge binary logs to 'mysql-bin.039790';
    golang操作mysql数据库的规范
  • 原文地址:https://www.cnblogs.com/zjj123456/p/5323982.html
Copyright © 2011-2022 走看看