二维表求最大子数组块
题目描述
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 }