最大联通子数组的和

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 }

结果截图:

总结:

在写(一)时,有一种惧怕心理,心理感觉这次题目很难实现,也没能静下心来写,今天静下心想方法以后比预期要提高不少,越来越发现人在思考的时候是人生最闪亮的时刻之一

以上是关于最大联通子数组的和的主要内容,如果未能解决你的问题,请参考以下文章

求最大联通子数组的和(结对开发)

数组问题求二维整型数组最大联通子数组的和

返回一个二维整数数组中最大联通子数组的和

返回一个二维整数数组中最大联通子数组的和

最大连通子数组的和

返回二维数组最大联通子数组的和