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

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

一、要求:
(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;  
}

 

四、執行結果:

五、照片

單人從網上學習,無。