標籤:
本次實驗任務:
思路分析:
將二維拆分為一維,先求得每一行的最大子數組的和,並且求得每一行最大子數組的起始元素和終止元素,與其他行的進行比較,檢查是否聯通,若聯通,則將兩行的子數組最大值和相加,找出不同行子數組最大值求和的最大值即為所求
已實現的代碼:
1 #include<iostream> 2 #include<ctime> 3 int max_(int j, int *array, int &first, int &last); 4 using namespace std; 5 #define row 5//行數 6 #define col 5//列數 7 int main() 8 { 9 srand((int)time(NULL));//隨機種子10 int i, j,a[100][100];11 int array[100];12 int max_row[100];13 int sum=0,max=0;14 int first_num=0, last_num=0;15 for (i = 0; i < row; i++)16 {17 for (j = 0; j < col; j++)18 {19 //從(-100)到100間的隨機數給二維數組賦值20 a[i][j] = rand() %(100-(-100)+1)-100 ;21 }22 }23 cout << "數組為:"<<endl;24 //顯示數組25 for (i = 0; i < row; i++)26 {27 for (j = 0; j < col; j++)28 {29 cout << a[i][j]<<" ";30 }31 cout << endl;32 }33 cout << endl;34 //------------------------------------------------------------35 //每一行賦予一個一維數組36 for (i = 0; i < row; i++)//每一行37 {38 for (j = 0; j < col; j++)//每一列39 { 40 array[j] = a[i][j];41 }42 max_row[i]=max_(j, array,first_num,last_num);//求每一行的子數組和的最大值43 cout << max_row[i] <<" "<< first_num<<" "<<last_num<<endl;44 45 }46 return 0;47 }48 //求一維數組子數組和的最大值49 int max_(int j,int *array,int &first,int &last)50 { 51 int sum = 0, max = 0;52 for (j = 0; j < col; j++)53 {54 sum = sum + array[j];55 if (sum > max)56 {57 max = sum;58 }59 if (sum < 0)60 {61 sum = 0;62 }63 if (max == 0)64 {65 sum = sum + array[j];66 if (sum > max)67 {68 max = sum;69 }70 }71 72 }73 return max;74 }
效果:
體會:由於主要精力放到了四則運算安卓方面(也沒有太多成果),導致本次任務時間有點緊張,思考不夠,現在只實現了求每一行子數組和的最大值,遇到瓶頸:由於演算法原因起始元素和終止元素的值得確定有點混亂,明天加油,今天腦袋有點亂了,先學會兒別的
聯通子數組(一)