• 求数组中最大子数组的和


      本篇博客介绍第二周课上小测:求数组中最大子数组的和,使用C++实现。

    代码:

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5 
     6     int a[100],i,n;
     7     //确定数组长度
     8     cin>>n;
     9     //输入数组元素
    10     for(i=1;i<=n;i++)
    11         cin>>a[i];
    12     //以子数组中的尾数为指针进行判断
    13     for(i=2;i<=n;i++)
    14     {
    15         //如果该数与前一个数相加大于该数,此位置替换为和,证明“并入”子数组
    16         if(a[i]+a[i-1]>a[i])
    17             a[i]=a[i]+a[i-1];
    18     }
    19     int ans=-100000;
    20     //再次遍历,最大值即为最大子数组的和
    21     for(i=1;i<=n;i++)
    22         ans=max(ans,a[i]);
    23     cout<<ans<<endl;
    24     return 0;
    25 }

    求最大子数组和的要点在于动态规划,只要理解其意就能写出代码。

    接下来改变了题目要求,数组变为循环数组,再求出最大子数组的和。解决思路:循环数组需要循环遍历,这里就令输入的长度为n的数组输入两次形成一个长度为2n的新数组,从头开始遍历(实现“循环”),再设置int变量k记录子数组的长度,如果该子数组的长度k>=n,则下一次计算时不进行相加验证操作,而是重新计算(子数组长度无法大于数组长度),最后进行遍历得出最大子数组和。代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5 
     6     int a[100], i, j, n, k = 1;
     7     cin >> n;
     8     //构成2n数组
     9     for (i = 1; i <= n; i++)
    10     {
    11         cin >> a[i];
    12         a[i + n] = a[i];
    13     }
    14     //计算子数组和
    15     for (i = 2; i <= 2*n; i++)
    16     {
    17         if (k < n)
    18         {
    19             if (a[i] + a[i - 1] > a[i])
    20             {
    21                 a[i] = a[i] + a[i - 1];
    22                 k++;
    23             }
    24             //若和不大于该数,证明不能连接成子数组
    25             else
    26                 k = 1;
    27         }
    28         //若k>=n,则证明该子数组已经饱和,不能再加
    29         else
    30         {
    31             k = 1;
    32             continue;
    33         }
    34     }
    35     int ans = -100000;
    36     //遍历求出最大子数组和
    37     for (i = 1; i <= 2*n; i++)
    38     {
    39         if (a[i] > ans)
    40             ans = a[i];
    41     }
    42     cout << ans << endl;
    43     return 0;
    44 }
  • 相关阅读:
    几种连接数据库的OLEDB驱动程序
    Javascript如何访问和处理系统文件
    如何自学Java 经典
    Android Studio 修改 包名
    Android Studio -导入项目 gradle处理
    Android Studio- 把项目提交到SVN中操作方法
    android studio 运行太慢了
    Java多线程 -sleep 用法详解
    Java -native 方法
    Java多线程 -yield用法
  • 原文地址:https://www.cnblogs.com/20183711PYD/p/12378685.html
Copyright © 2020-2023  润新知