poj acm 1050 最大子矩阵

解决这个的思路很简单,我文笔不是很好,希望可以表述清楚:

1.首先,我们来看一维的数组的最大子段:

例如 int a[]={0 4 -3 2},sum[i]表示以a[i]结尾的串的最大和,很容易可表示出来:sum[i]=max{(sum[i-1]+a[i]),a[i]},最后求出sum数组的最大值即为该数组的最大子段和。

2.然后进行二维扩展:例如二维矩阵A[4][4]

      

       假如最大子矩阵的行为i~j行,则将i~j的各列加到sum数组中,即sum[k]=A[i][k]+A[i+1][k]+……+A[j][k],然后对sum数组求出最大子段即可(用第一种方法)

       下面就是遍历所有的i,j组合(0,0)(0,1)……(3,2)(3,3),然后在所有的最大子段求出最大值。

    

#include<memory.h>
#include<stdio.h>

# define MAXN 100
int n;
int data[MAXN][MAXN];
int dp(int i,int j)
{
	int p,q;
	int dtmp[MAXN];
    memset(dtmp,0,sizeof(dtmp));
	int sum[MAXN];
	int max=-127*n;
	for(int p=0;p<n;p++)
	{
		for(q=i;q<=j;q++)
			 dtmp[p]+=data[q][p];
	}
	sum[0]=dtmp[0];
    for(p=1;p<n;p++)
	{
		if(sum[p-1]>0)
			sum[p]=sum[p-1]+dtmp[p];
		else
			sum[p]=dtmp[p];
	}
	for(p=0;p<n;p++)
		if(sum[p]>max)
			max=sum[p];
	return max;
}
int main()
{
	int i,j;
	int temp;
    scanf("%d",&n);
	int max=-127;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&data[i][j]);
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=i;j<n;j++)
		{
            temp=dp(i,j);
			if(max<temp)
				max=temp;
		}
	}
	printf("%d",max);
    return 0;
}

                 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值