算法描述:本题可以使用穷举法,但是那样不容易实现以及效率不高,我们的想法是,将二维数组变成一维数组,再将此“一维数组”按照上次的做法既可求出最大子数组,
怎么样将二维变成一维呢:例如我们做的是四行四列的数组,将每一行用一个sum来表示,则有sum[1],sum[2],sum[3],sum[4],sum[1]动态的代表此行的和,例如前两个数的和,再往后变成前三个数的和,每当求出一行的和时,同时也求出了以下三行的和,然后将sum数组看成一维数组进行比较求出最大值,然后动态的向后推进,直到遍历完,即可求出最大值
程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include<stdio.h> int main() { int m,n,i,j,i1,z; int sum1,sum[4]; int a[4][4]; int max=0; printf ( "请输入数据
" ); for (i=0;i<4;i++) for (j=0;j<4;j++) scanf ( "%d" ,&a[i][j]); for (m=0;m<4;m++) { for (i1=0;i1<4;i1++) {sum[i1]=0;} //初始化 for (j=m;j<4;j++) { for (i=0;i<4;i++) { sum[i]+=a[i][j]; } //求行的值变成一维数组 for (n=0;n<4;n++) { sum1=0; for (z=n;z<4;z++) { sum1+=sum[z]; if (sum1>max) max=sum1; } } } } printf ( "最大值为%d
" ,max); return 0; } |
运行结果:
课下讨论截图: