1. 程式人生 > >返回一個整數數組最大子數和。(新)

返回一個整數數組最大子數和。(新)

每一個 unsigned 元素 子數組和 程序代碼 turn 思想 第一個 排列

一、要求:
(1)輸入一個整形數組,數組裏有正數也有負數。
(2)數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。
(3)如果數組A[0]……A[j-1]首尾相鄰,允許A[i-1],......A[n-1], A[0]……A[j-1]之和最大。

二、設計思想:

如果數組首尾相連,那麽每一個元素都可以當成是開頭即從A[n]開始,到A[n-1]結束,這樣的話,就相當用剪子在一開始的數組中的元素的前一位剪開。這樣的話,可以建立新的三個數組,前兩個數組分別盛放剪開的兩部分,第三個數組則是負責把前兩個數組按順序存放起來。前兩個數組的長度之和等於第三個數組長度。這樣便組成了新的數組。再按照以前計算條形數組的方法計算即可。

三、程序代碼:

#include <iostream>
#include<ctime>
#define Num 10000
using namespace std;
int DTGH_Sum(int a[],int n) //動態規劃法求子段和函數
{
int sum = 0;
int *b = (int *) malloc(n * sizeof(int)); //動態為數組分配空間
b[0] = a[0];
for(int i = 1; i < n; i++)
{
if(b[i-1] > 0)
b[i] = b[i - 1] + a[i];
else
b[i] = a[i];
}
for(int j = 0; j < n; j++)
{
if(b[j] > sum)
sum = b[j];
}
delete []b; //釋放內存
return sum;
}
int main()
{ int temp,b;
int sum=0;
int i;
int a1,a2;
int a[Num];
int length=0;
while (length==NULL||length == 0)//如果數組長度為空或零則請重新輸入
{
cout<<"請輸入數組長度:";
cin>>length;
}
cout<<"生成隨機數組: "<<endl;
srand((unsigned)time(NULL));
for(i=0;i<length;i++)//產生隨機序列
{
if(rand()%2==0)
{
a[i]=rand()%50;
}
else
{
a[i]=(-1)*rand()%50;
}
cout<<a[i]<<" ";
}
cout<<endl;
cout<<"此首尾相連的數組中最大子數組的和有以下幾種可能:"<<endl;
cout<<"第1種排列方式:"<<endl;
for( i=0;i<length;i++)
{
cout<<a[i]<<" ";
}
cout<<"最大子數組和為:"<<DTGH_Sum(a,length)<<endl;
a1=DTGH_Sum(a,length);
for(b=1;b<length;b++)
{
temp=a[0];
for(i=1;i<=length;i++)
{
a[i-1]=a[i]; //將第一個數變為最後一個數

}
a[length-1]=temp;
cout<<"第"<<b+1<<"種排列方式:"<<endl;
for( i=0;i<length;i++)
{
cout<<a[i]<<" ";
}
cout<<"最大子數組和為:"<<DTGH_Sum(a,length)<<endl;
if(DTGH_Sum(a,length)>=sum)
{
sum=DTGH_Sum(a,length);
}
}
a2=sum;
cout<<endl;
if(a1>=a2)
{
cout<<"綜上,最大的子數組和為:"<<a1<<endl;
}
else
{
cout<<"綜上,最大的子數組和為:"<<a2<<endl;
}
return 0;
}

四、運行結果:

技術分享圖片

五、照片

單人從網上學習,無。

返回一個整數數組最大子數和。(新)