求一个二维数组的最大子矩阵(王伟光,曹锦锋)

算法描述:本题可以使用穷举法,但是那样不容易实现以及效率不高,我们的想法是,将二维数组变成一维数组,再将此“一维数组”按照上次的做法既可求出最大子数组,

怎么样将二维变成一维呢:例如我们做的是四行四列的数组,将每一行用一个sum来表示,则有sum[1],sum[2],sum[3],sum[4],sum[1]动态的代表此行的和,例如前两个数的和,再往后变成前三个数的和,每当求出一行的和时,同时也求出了以下三行的和,然后将sum数组看成一维数组进行比较求出最大值,然后动态的向后推进,直到遍历完,即可求出最大值

程序:

#include<stdio.h>
int main()
{
	int m,n,i,j,i1,z;
	int sum1,sum[4];
	int a[4][4];
	int max=0;
	printf("请输入数据\n");
	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\n",max);

	return 0;
}

  运行结果:

    

 课下讨论截图:

转载于:https://www.cnblogs.com/wangweiguang/p/3608577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值