• 《子数组最大和》


    (1)源代码:

     1 #include<iostream>
     2 using namespace std;
     3 #define N 10000
     4 
     5 int max(int a, int b)
     6 {
     7     int y;
     8     if (a > b&&b < 0)
     9     {
    10         y = a;
    11     }
    12     if (a < b&&a < 0)
    13     {
    14         y = b;
    15     }
    16     if (a + b >= a&&a + b >= b)
    17     {
    18         y = a + b;
    19     }
    20     return y;
    21 }
    22 
    23 int select(int a[], int l, int r)
    24 {
    25     int m = (r + l) / 2;
    26     if (r == l)
    27     {
    28         return a[l];
    29     }
    30     int maxr = a[m+1], maxl = a[m];
    31     int ml = a[m], mr = a[m + 1];
    32     for (int i = m - 1; i >= l; i--)
    33     {
    34         ml = ml + a[i];
    35         if (maxl <= ml)
    36         {
    37             maxl = ml;
    38         }
    39     }
    40     for (int i = m + 2; i <= r; i++)
    41     {
    42         mr = mr + a[i];
    43         if (maxr <= mr)
    44         {
    45             maxr = mr;
    46         }
    47     }
    48     int e=select(a, l, m);
    49     int z=select(a, m + 1, r);
    50     int u=max(maxr, maxl);
    51     if (u >= e&&u >= z)
    52     {
    53         return u;
    54     }
    55     if (e > z&&e > u)
    56     {
    57         return e;
    58     }
    59     if (z > e&&z > u)
    60     {
    61         return z;
    62     }
    63 }
    64 int main()
    65 {
    66     int n, m, s , a[N];
    67     cout << "请输入数组中有几个数字:";
    68     cin >> s;
    69     cout << "请输入数组中整数的范围(第一个数小于第二个数):";
    70     cin >> n >> m;
    71     for (int i = 0; i < s; i++)
    72     {
    73         a[i] = rand() % (m - n + 1) + n;
    74         cout << a[i] << "   ";
    75     }
    76     cout << endl;
    77     int p=select(a, 0, s-1);
    78     cout << "子数组的最大和为" << p << endl;
    79     return 0;
    80 }

    (2)运行截图:

    (3)思路:

    对于求子数组最大值有时间复杂度的要求,不能用两个for语句嵌套,我是用的递归算法,利用类似折半查找对元素进行相加并且进行比较,从而求出每个数组的子数组和为最大的值,再循环比较。

    (4)

    缺陷记录日志:

    用时:90分钟,从3月23号11:00到12:30

            20分钟,从17:50到18:10对程序的不足进行改进

  • 相关阅读:
    bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)
    bzoj2956: 模积和(数论)
    51nod 1766 树上的最远点对(线段树)
    bzoj2621: [Usaco2012 Mar]Cows in a Skyscraper(状压DP)
    Codeforces Round #441 Div. 2题解
    bzoj4569: [Scoi2016]萌萌哒(ST表+并查集)
    iOS和Android后台机制对比
    UIApplicationDelegate 各方法回调时机
    iOS OC和JS的交互 javaScriptCore方法封装
    iOS应用的执行原理
  • 原文地址:https://www.cnblogs.com/1305yyf/p/4359471.html
Copyright © 2020-2023  润新知