返回一个整数数组中最大子数组的和(加强版)

题目:返回一个整数数组中最大子数组的和

要求:让数组手尾相连,构成一个环,同时返回最大子数组的位置

设计思想

1、将环断开,成为一条线,分析这条线上的最大子数组,找到最大子数组,便可以找到最大子数组的起点和终点。

2、然后将终点看作起点,将起点看作终点,将线连成环,在进行寻找最大子数组(寻找时不算上起点和终点)。

3、最后将先后找到的两个最大子数组连在一起就形成了这个整数组环的最大子数组,然后将记录的起点和终点输出出来,返回最大子数组的位置。

源代码:

#include<iostream>
#define n 100
using namespace std;
void main()
{
    int a[n], b[n][n];
    int length, i, j, w = 0, p = 0, q = 0, temp, m;
    cout << "输入随机整数" << endl;
    for (length = 0;;)
    {
        cin >> a[length];
        length++;
        if (getchar() == '\n')
        {
            break;
        }
    }
    cout << "这个数组的长度为:" << length << endl;
    //求子数组
    for (i = 0; i<length; i++)//两次循环,进行排除法,判断每个数所构成的最大子数组
    {
        m = i;
        w = 0;
        j = 0;
        while (j <= length - 1)
        {
            w += a[m];
            b[i][j] = w;
            m++;
            if (m>length - 1)
            {
                m = 0;
            }
            j++;
        }
    }
 
    temp = b[0][0];
    for (i = 0; i<length; i++)//将每个数对应的最大子数组进行判断,最后得到整个整数组的最大子数组
    {
        for (j = 0; j<length; j++)
        {
            if (b[i][j]>temp)
            {
                temp = b[i][j];
                p = i;
                q = j;
            }
        }
    }
 
    cout << "最大子数组的值为:" << temp << endl;
    cout << "最大子数组中元素的下标位子置:" << endl;
    i = 0;
    while (i <= q)
    {
        cout << p << "  ";
        p++;
        if (p >= length)
        {
            p = 0;
        }
        i++;
    }
 
    cout << endl;
}

测试结果

总结:本次试验主要是运用环插入的思想来做的,需要充分考虑到连接的问题。所以我们使用分别比较不同的两个起点的对大数组来实现的。

队友:吕广浩  网址:http://www.cnblogs.com/lvstudy/

 

posted @ 2016-03-27 17:18  apan008  阅读(783)  评论(1编辑  收藏  举报