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

二維數組最大值首尾相連

return 環形數組 bsp [] arr turn != 要求 設計

題目要求:

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

輸入一個整形數組,數組裏有正數也有負數。

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

如果數組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;
}

技術分享圖片

結組人:倪彤煒 谷豪磊

技術分享圖片

二維數組最大值首尾相連