• 最大联通子数组的和(二)


    设计思路同最大联通子数组的和(一)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 }

    结果截图:

    总结:

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

  • 相关阅读:
    反射
    特性(Attribute)
    简单了解Ado.net(下)
    幸福不会来敲门
    C#网络编程之服务客户模式在控制台下的简单交互
    简单了解Ado.net(上)
    简单实体框架
    自己动手写泛型List<T>
    opencv学习之路(1)
    C语言学习之文件操作(含重庆大学研究生程序设计大赛的题目和解答)
  • 原文地址:https://www.cnblogs.com/brucekun/p/5360233.html
Copyright © 2020-2023  润新知