標籤:
相較於上次求最大子矩陣的和,這次明顯更難了一些。
將問題分解並分析,可以想到 先求各行中的最大子數組,並記錄下標,求完之後再將各行的最大子數組的下標進行比較可以得到兩種情況
1.上一行的最大子數組下標範圍和下一行的最大子數組下標範圍有重合的部分。
2.上一行的最大子數組下標範圍和下一行的最大子數組下標範圍無重合的部分。
程式碼:
#include<iostream>using namespace std;int calculate(int n,int a[],int &sm,int &mm){ int b[100]={0}; int i,sum1=0,max1=0; for(i=0;i<n;i++) { if(sum1<0) { sum1=a[i]; } else { sum1=sum1+a[i]; } b[i]=sum1; } max1=b[0]; for(i=0;i<n;i++) { if (max1<b[i]) { max1= b[i]; mm = i; } } for (i = mm;i >= 0;i--) { if (b[i] == a[i]) { sm= i; break; } } return max1;}int main(){ int row,line,sm,mm,t2,sum,max; int up[10],down[10],t[10],b[10]; cout<<"輸入數組的行: "; cin>>row; cout<<"輸入數組的列: "; cin>>line; int **a; a = new int*[row]; for(int i=0; i<row;i++) { a[i] = new int [line]; } cout<<"請輸入數組元素:"<<endl; for(int i=0;i<row;i++) { for(int j=0;j<line;j++) { cin>>a[i][j]; } } for(int i=0;i<row;i++) { for(int j=0;j<line;j++) { b[j]=a[i][j]; } sum=calculate(line,b,sm,mm); up[i]=sm; down[i]=mm; t[i]=sum; } t2=t[0]; for(int i=0;i+1<row;i++) { if(up[i]<=down[i+1] && down[i]>=up[i+1]) { t2+=t[i+1]; } for(int j=up[i];j<up[i+1];j++) { if(a[i+1][j]>0) { t2+=a[i+1][j]; } } } cout<<"最大聯通子數組的和是:"<<t2<<endl; for(int i=0;i<row;i++) { delete [] a[i]; } delete [] a; system("pause"); return 0;}
這次實驗嘗試了各種方法,都是太複雜的方法,難以實現,這個方法雖然不難,但是還是有缺陷,以後我們會改正。
組員:趙承聖,羅元浩(http://www.cnblogs.com/lyhao/)
數組問題(三)求二維整型數組最大聯通子數組的和