1. 程式人生 > >二維陣列最大值首尾相連

二維陣列最大值首尾相連

 

題目要求:

返回一個整數陣列中最大子陣列的和。

輸入一個整形陣列,數組裡有正數也有負數。

陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。

如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同時返回最大子陣列的位置。

設計思路:

陣列首尾相連,可在任意位置將陣列剪斷,然後將剪斷位置之前的陣列資料按照順序接在原陣列之後形成新陣列。然後開始遍歷陣列,同時設定N讓N的最大值為原陣列長度,使得遍歷時最大子陣列長度不會超出原長度。

原始碼:

#include <iostream>
using namespace std;
#define N 1000
int main(int argc, char* argv[])
{
    int arry[N];
    int length=1;
    int max[N],max1;
    int maxweizhi[N];
    int num=0;
    int value( int arry[],int length);
    cout<<"請輸入陣列:"<<endl;
    cin >> arry[0];
    while (getchar() != '\n')   
    {
        cin >> arry[length];
        length++;
    }
  
     for(int j=length;j<2*length-1;j++)  
    {
        arry[j]=arry[num];
        num++;
    }
 
    cout<<"由這幾個數形成的環形陣列";
    value(arry,2*length-1);
    return 0;
}
int value( int arry[],int length)
{
    int max[N],max1;
    int maxweizhi[N];
    for(int j=0;j<(length+1)/2;j++)
    {
        int sum=0;
        max1=-99999;                  
        int z=0;
        for(int i=j;i<(length+1)/2+j;i++)  
        {
            sum=sum+arry[i];
            if(sum>=max1)
            {
                max1=sum;
                z++;
            }
        }
        max[j]=max1;
        maxweizhi[j]=z;
    
    }
    int fmax=max[0];
    int q=0;
    for(int i=0;i<(length+1/2);i++) 
    {  
        if(max[i]>fmax)
        {
            fmax=max[i];
            q=i;
        }
    }
 
    int weizhi=maxweizhi[q];
 
    cout<<"最大子陣列的和為:"<<endl;
    for(int num=q;num<q+weizhi;num++) 
    {
        cout<<arry[num];
    }
 
    cout<<"最大子陣列的和為:  "<<fmax<<endl;
    return 0;
}

結組人:倪彤煒 谷豪磊