最大联通子数组的和
Posted 四季信风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大联通子数组的和相关的知识,希望对你有一定的参考价值。
设计思路同最大联通子数组的和(一)http://www.cnblogs.com/brucekun/p/5356994.html
将(一)未完成的部分做了基本补充,但是还存在bug:
⑴每行最大子数组的和为负数时显示为0(具体算法见http://www.cnblogs.com/brucekun/p/5316601.html)
⑵返回每行最大子数组的起始和最后元素时有时会出错
源代码:
1 #include<iostream> 2 #include<ctime> 3 int max_(int j, int *array, int &first, int &last); 4 using namespace std; 5 #define row 3//行数 6 #define col 3//列数 7 int main() 8 { 9 srand((int)time(NULL));//随机种子 10 int i, j,a[100][100]; 11 int fir[100];//存放起始元素 12 int la[100];//存放最终元素 13 int array[100]; 14 int max_row[100]; 15 int M[100]; 16 int MAX = 0; 17 int first_num=0, last_num=0; 18 for (i = 0; i < row; i++) 19 { 20 for (j = 0; j < col; j++) 21 { 22 //从(-100)到100间的随机数给二维数组赋值 23 a[i][j] = rand() %(100-(-100)+1)-100 ; 24 } 25 } 26 cout << "数组为:"<<endl; 27 //显示数组 28 for (i = 0; i < row; i++) 29 { 30 for (j = 0; j < col; j++) 31 { 32 cout << a[i][j]<<" "; 33 } 34 cout << endl; 35 } 36 cout << endl; 37 //------------------------------------------------------------ 38 //每一行赋予一个一维数组 39 for (i = 0; i < row; i++)//每一行 40 { 41 for (j = 0; j < col; j++)//每一列 42 { 43 array[j] = a[i][j]; 44 } 45 max_row[i]=max_(j, array,first_num,last_num);//求每一行的子数组和的最大值 46 cout << max_row[i] << endl;//每行最大元素 47 cout << "首元素" << first_num + 1 << endl; 48 cout<< "尾元素" << last_num + 1 << endl; 49 //判断每行是否有联通的数 50 51 } 52 for (i = 0; i < row; i++) 53 { 54 if (a[i][last_num]>=a[i + 1][first_num]||a[i][first_num]<=a[i+1][last_num]) 55 { 56 M[i] = max_row[i] + max_row[i+1]; 57 if (M[i]>MAX) 58 { 59 MAX = M[i]; 60 } 61 } 62 } 63 cout << "最大联通子数组的和为:" << MAX; 64 return 0; 65 } 66 //求一维数组子数组和的最大值 67 int max_(int j,int *array,int &first,int &last)//first、last为起始元素和最终元素位置 68 { 69 int sum = 0, max = 0,c[100]; 70 for (j = 0; j < col; j++) 71 { 72 sum = sum + array[j]; 73 c[j] = sum; 74 if (sum < 0)//和为正数时 75 { 76 sum = 0; 77 } 78 if (sum > max) 79 { 80 max = sum; 81 if (max == 0)//和为负数时 82 { 83 sum = sum + array[j]; 84 if (sum > max) 85 { 86 max = sum; 87 } 88 } 89 } 90 if (c[j - 1] < 0 ) 91 { 92 first = j; 93 } 94 if (c[j] == max) 95 { 96 last = j; 97 } 98 } 99 return max; 100 }
结果截图:
总结:
在写(一)时,有一种惧怕心理,心理感觉这次题目很难实现,也没能静下心来写,今天静下心想方法以后比预期要提高不少,越来越发现人在思考的时候是人生最闪亮的时刻之一
以上是关于最大联通子数组的和的主要内容,如果未能解决你的问题,请参考以下文章