zoukankan      html  css  js  c++  java
  • 返回一个二维整数数组中最大联通子数组的和

    设计思路

    因为矩阵中的数是随机生成的,可能会有正有负,所以要首先判断二维数组中哪些位置上的数是正数,利用另一个二维数组记录正数的位置,然后判断哪些数是连通的,我的思路是先判断两个数的行数(列数)是否相同,如果相同,再判断列数(行数)是否相邻,如果相邻即证明两个数连通,计算每个连通块的数值的和,然后再连通不同的块,计算其和,最后比较其中的最大值,即为二维整数数组中最大联通子数组的和。

    源程序代码

     1 #include<iostream>
     2 using namespace std;
     3 int zuida(int n,int a[],int *sm,int *mm);
     4 
     5 void main()
     6 {
     7     int m,n,i,j,sm,mm,t2;
     8     int sum,max;
     9     int up[100],down[100],t[100];
    10     int a[100][100],b[100];
    11     cout<<"输入二维数组的行"<<endl;
    12     cin>>m;
    13     cout<<"输入二维数组的列"<<endl;
    14     cin>>n;
    15     for(i=0;i<m;i++)
    16     {
    17         for(j=0;j<n;j++)
    18         {
    19             cin>>a[i][j];
    20         }
    21     }
    22 
    23     for(i=0;i<m;i++)
    24     {
    25         for(j=0;j<n;j++)
    26         {
    27             b[j]=a[i][j];
    28         }
    29         sum=zuida(n,b,&sm,&mm);
    30         up[i]=sm;                                   
    31         down[i]=mm;
    32         t[i]=sum;
    33 
    34     }
    35     t2=t[0];
    36     for(i=0;i+1<m;i++)
    37     {
    38         if(up[i]<=down[i+1] && down[i]>=up[i+1])
    39         {
    40             t2+=t[i+1];
    41         }
    42         for(j=up[i];j<up[i+1];j++)
    43         {
    44             if(a[i+1][j]>0) t2+=a[i+1][j];                   //判别独立正数
    45         }
    46 
    47     }
    48     cout<<t2<<endl;
    49 
    50 }
    51 
    52 
    53 int zuida(int n,int a[],int *sm,int *mm)
    54 {
    55     int b[100]={0};
    56     int i,sum1=0,max1=0;
    57     for(i=0;i<n;i++)
    58     {
    59         if(sum1<0)
    60         {
    61             sum1=a[i];
    62         }
    63         else
    64         {
    65             sum1=sum1+a[i];
    66         }
    67         b[i]=sum1;
    68     }
    69     max1=b[0];
    70     for(i=0;i<n;i++)
    71     {
    72         if (max1<b[i])
    73         {
    74             max1= b[i];
    75             *mm = i;
    76         }
    77     }
    78     for (i = *mm;i >= 0;i--)
    79     {
    80         if (b[i] == a[i])
    81         {
    82             *sm= i;
    83             break;
    84         }
    85     }
    86     return max1;
    87 }

    运行结果截图

    编程总结

    这道题目比较难,需要仔细思考问题的解决方法。

  • 相关阅读:
    Merge Intervals
    Jump Game
    微信小程序----button组件
    微信小程序----日期时间选择器(自定义精确到分秒或时段)(MUI日期时间)
    禁止搜索引擎抓取robots.txt文件设置方法
    [转载]【转】代码的版权声明怎么写
    微信小程序----picker选择器(picker、省市区选择器)(MUI选择器)
    微信小程序----模板(template)
    nginx安全配置
    微信小程序----icon组件
  • 原文地址:https://www.cnblogs.com/BUANG/p/4458009.html
Copyright © 2011-2022 走看看