• 二维表求最大子数组块


    题目描述

    1.上一次作业是要求在一个一维序列里找一个最大连续子串,这次是在一个二维表里找一个最大子数组块(允许不规则出现)

    程序思想

    第一种思想:将二维表中所有正数记录下标,同时把相连的正数当成一个整数块。这时,问题变成几个整数块是否能连接在一起形成最大子数组块。

                           需要用到迪杰斯特拉求几个整数块的最短连接路径方法。该思想简单明了,但是施行起来难度过大,简单来说,不会....

    第二种思想:     将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。c[0][]=a[0][];c[1][]=a[0][]+a[1][];依次往下。

    代码

      1 int max1(int a[],int N)    //球一维最大和
      2 {
      3 
      4     int b[20];    //正负交替数组
      5     int c[20];    //最终比较数组
      6     int i;
      7     int M;        //存放数组b的长度
      8     int j=0;
      9     int max;      //存放最大值
     10     int p=0;
     11     int sum;      //相邻正数和
     12     int sum1;     //相邻负数和
     13     sum=0;
     14     sum1=0;
     15     int u=0;
     16     //判断数组是否全负
     17     for(i=0;i<N;i++)
     18     {
     19         if(a[i]>=0)
     20         {
     21             u=1;
     22         }
     23     }
     24     if(u==1)
     25     {
     26         //求出相邻正数或相邻负数的和,形成正负交替数组
     27         for(i=0;i<N;i++)
     28         {
     29             if(a[i]>=0)
     30             {
     31                 if(i<N-1)
     32                 {
     33                     if(a[i+1]>=0)
     34                     {
     35                         sum=sum+a[i];
     36                     }
     37                     else
     38                     {
     39                         b[j++]=sum+a[i];
     40                         sum=0;
     41                     }
     42                 }
     43                 else
     44                 {
     45                     if(a[i-1]>=0)
     46                     {
     47                          b[j++]=sum+a[N-1];
     48                     }
     49                     else
     50                     {
     51                          b[j++]=a[N-1];
     52                     }
     53                 }
     54 
     55             }
     56             else if(a[i]<0)
     57             {
     58                 if(i<N-1)
     59                 {
     60                     if(a[i+1]<0)
     61                     {
     62                         sum1=sum1+a[i];
     63                     }
     64                     else
     65                     {
     66                         b[j++]=sum1+a[i];
     67                         sum1=0;
     68                     }
     69                 }
     70                 else
     71                 {
     72                     if(a[i-1]<0)
     73                     {
     74                         b[j++]=sum1+a[N-1];
     75                     }
     76                     else
     77                     {
     78                         b[j++]=a[N-1];
     79                     }
     80                 }
     81             }
     82         }
     83         M=j;
     84         if(b[0]<0)
     85         {
     86             j=1;
     87         }
     88         else
     89         {
     90             j=0;
     91         }
     92         //对数组B进行操作,将利用算法求的机最大值存入数组c中
     93         for(int y=j;y<M;y=y+2)
     94         {
     95             if(y+2<M)
     96             {
     97                 if(b[y]+b[y+1]>=0)
     98                 {
     99                     c[p++]=b[y];
    100                     b[y+2]=b[y+2]+b[y+1]+b[y];
    101                     if((y+2==M-1)||(y+2==M-2))
    102                     {
    103                         c[p++]=b[y+2];
    104                         break;
    105                     }
    106                 }
    107                 else
    108                 {
    109                     c[p++]=b[y];
    110                 }
    111             }
    112             else
    113             {
    114                 c[p++]=b[y];
    115             }
    116 
    117         }
    118         //对数组c求最大值
    119         max=c[0];
    120         for(i=0;i<p;i++)
    121         {
    122             if(c[i]>=max)
    123             {
    124                 max=c[i];
    125             }
    126         }
    127         return max;
    128     }
    129     else
    130     {
    131         max=a[0];
    132         for(i=0;i<N;i++)
    133         {
    134             if(a[i]>=max)
    135             {
    136                 max=a[i];
    137             }
    138         }
    139         return max;
    140     }
    141 }
    142 int main()
    143 {
    144     ofstream outFile;
    145     outFile.open("test.txt",ios::app);
    146     int a[20][20];
    147     int length,index;
    148 
    149     cout<<"输入行数列数:";
    150     cin>>index>>length;
    151     outFile<<"行数:"<<index<<endl;
    152     outFile<<"列数:"<<length<<endl;
    153     outFile.close();
    154     int y=0;
    155     for(int i=0;i<index;i++)
    156     {
    157         for(int j=0;j<length;j++)
    158         {
    159             cin>>a[i][j];
    160         }
    161     }
    162     writeFile(a,length,index);
    163 
    164     int s=column(a,length,index);
    165     cout<<"最大和为:"<<s<<endl;
    166     return 0;
    167 }

    截图

  • 相关阅读:
    204. 计数质数
    面试题 16.06. 最小差
    8. ubantu系统相关
    7. 理论
    6. 图像处理
    5.git
    4.Torch量化
    3.Torch优化工具
    2.DB算法及代码问题分析
    1. 显卡相关问题
  • 原文地址:https://www.cnblogs.com/du1269038969/p/6678703.html
Copyright © 2020-2023  润新知