• 求最大子数组02


    题目:整数数组中最大子数组的和

    要求:

    1. 输入一个整形数组,数组里有正数也有负数。
    2. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    3. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
    4. 同时返回最大子数组的位置。 求所有子数组的和的最大值。

    这次任务多了一个要求就是这个数组是环形的,

    也就是可以从A[i-1],…… A[n-1],A[0],A[1]这样的数组也阔以,那么首先想到的就是循环链表,然后控制求和的子数组长度即可,但是,链表首元素从哪定呢。。。用DP的话终止条件怎么设置。。。

    所以我感觉这个方法可能不太好走,于是,想到了既然是个环形的数组,那子数组也要有要求吧,如果数组元素全部之和为正,

    那么一直循环下去求和子数组的和岂不是+∞,这样下去还能了得。。。

    ,子数组的长度一定小于等于原数组,那么两个数组Arr首尾相接构成的新数组肯定可以包含所有子数组,

    然后再打表求所有子数组的和,再求max,这不手到擒来嘛,赶紧的码起

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 #define max_Num 100
     5 int main(int argc, char *argv[])
     6 {
     7     int a[]={115,15,-565,9465,-66,11,15,9400};
     8     vector<int> arr(a,a+(int)(sizeof(a)/sizeof(int)));
     9     arr.insert(arr.end(),arr.begin(),arr.end());
    10     int arrtemp[max_Num][max_Num]={0};         //记录数列之和的表  arrtemp[i][j]表示为子数组arr中[i,j]元素之和
    11     for(int i = 0;i <(int)(arr.size()/2); i++)
    12     {
    13         for(int j = 0;j<(int)(arr.size());j++)
    14         {
    15             if((i <= j) && (j < i + (int)(arr.size()/2)))  //i<=j控制元素顺序,j <i+length控制子数列长度
    16             {
    17                 for(int k = i; k <= j; k++)
    18                 {
    19                     arrtemp[i][j] += arr[k];
    20                 }
    21             }
    22         }
    23     }
    24 
    25     int maxtemp = arrtemp[0][0];   //临时最大值设为arr[0][0]即 arr[0]
    26     int start = 0;
    27     int end = 0;
    28     for(int i = 0;i < (int)(arr.size()/2); i++)
    29     {
    30         for(int j = 0;j < (int)(arr.size());j++)
    31         {
    32             if((i <= j) && (j < (int)(i+arr.size()/2)))  //i<=j控制元素顺序,j<i+length控制子数列长度
    33             {
    34                 if( arrtemp[i][j] > maxtemp)
    35                 {
    36                     maxtemp = arrtemp[i][j];
    37                     start = i;
    38                     end = j;
    39                 }
    40             }
    41         }
    42     }
    43 
    44     cout <<"sum:"<< maxtemp <<"start:"<< start <<"end:"<<end % (arr.size() / 2) <<endl;
    45     return 0;
    46 }
    (i <= j) && (j < (int)(i+arr.size()/2))是控制元素求和用的,比如一个数组有4个元素,那么求和打表的内容只能填充到
    O O O O X X X X
    X O O O O X X X
    X X O O O O X X
    X X X O O O O X
    中 O 的位置,其他位置不可能是子数组之和。

    这个程序的复杂度是O(n2) ,
    然后注意的是存放临时子数组和的二位数组不能设置太大, 不然会内存溢出。。。。不懂啊 ,我才设1000*1000,就爆了,在QT creator上调试了好久也找不到错,拿到VS上就提示stack overflow
    也是醉了。。
    日期 听课 编程 读书 看代码 写博客 总结
    星期一 120 120   150   390
    星期二   60   120   180
    星期三       90   90
    星期四 120 120   60   300
    星期五       120   120
    星期六   60       60
    星期日   240     90 330
    周总结 240 600 0 540 90 1470













    缺陷记录日志
    日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
    3/27 1 stack overflow 编码 调试 20min  






    我的小组成员:刘伟
  • 相关阅读:
    【矩阵乘】【DP】【codevs 1305】Freda的道路
    Giraph源代码分析(九)—— Aggregators 原理解析
    Dubbo框架应用之(三)--Zookeeper注冊中心、管理控制台的安装及解说
    Oracle中对数字加汉字的排序(完好)
    PKU-2104-K-th Number
    IE下推断IE版本号的语句
    自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,&quot;掏粪男孩Gif&quot;顺便再提提onWindowFocusChanged)
    <html>
    测试一个网段主机在线情况,禁ping的情况除外
    glance image-create --name "wj_js_company_img" --file a0e1c7fa-d6d3-410f-9bb5-e699e342db91 --disk-format qcow2 --container-format bare --progress --visibility public
  • 原文地址:https://www.cnblogs.com/xiaoxt/p/5324923.html
Copyright © 2020-2023  润新知