二维表求最大子数组块

题目描述

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 }

 

截图

posted @ 2017-04-07 16:17  发酸的丶蛋炒饭  阅读(169)  评论(0编辑  收藏  举报