最大联通子数组的和(一)
本次实验任务:
思路分析:
将二维拆分为一维,先求得每一行的最大子数组的和,并且求得每一行最大子数组的起始元素和终止元素,与其他行的进行比较,检查是否联通,若联通,则将两行的子数组最大值和相加,找出不同行子数组最大值求和的最大值即为所求
已实现的代码:
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 }
效果截图:
体会:由于主要精力放到了四则运算安卓方面(也没有太多成果),导致本次任务时间有点紧张,思考不够,现在只实现了求每一行子数组和的最大值,遇到瓶颈:由于算法原因起始元素和终止元素的值得确定有点混乱,明天加油,今天脑袋有点乱了,先学会儿别的