矩阵最大 max sum

矩阵最大 max sum
给定一个2维的由正数组成的整数矩阵,找出其中具有最大和的子矩阵。一个矩阵的和就是矩阵中所有元素的和。本题中,具有最大和的子矩阵称为最大子矩阵。子矩阵是指位于整个矩阵中任何一个1×1或更大的连续的子矩阵。例如,在矩阵 
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 

中其最大子矩阵在其左下角: 
9 2 
-4 1 
-1 8 
提点算法,我自己的超时!-_-!!谢谢啦! 
最佳答案
这个题目算法是三次的,类似于求最长子序列和的O(n)算法。
先预处理求一个二维阵列S[i][j]=s[0][j]+s[1][j]+……+s[i][j],
枚举行i和j表示第i行到第j行之间的子矩阵,
然后把第k列中的i行到j行之间的元素和当成一维子矩阵和中的一个元素,
用一维的O(N)算法求得i行到j行的最大子矩阵和。
这样算来,预处理是二次时间的,枚举行时间是二次的,
两行间用一次最长子序列和是一次的,算来是三次时间复杂度的,就可以AC了。
给你看一下我的AC代码,在ZOJ1074上过的
#include<stdio.h>
#include<memory.h>
int a[101][100],n,i,max,sum,j,x,k;
int main()
{
 scanf("%d",&n);
 max=-12701;
 for (i=1;i<=n;i++)
 {
  if (i==1)
   for (j=0;j<n;j++)
   {
    scanf("%d",&a[1][j]);
    a[0][j]=0;
   }
   else 
    for (j=0;j<n;j++)
    {
     scanf("%d",&x);
     a[i][j]=a[i-1][j]+x;
    }
 }
 for (i=1;i<=n;i++)
  for (j=1;j<=i;j++)
  {
   sum=0;
   for (k=0;k<n;k++)
   {
    sum+=(a[i][k]-a[j-1][k]);
    if (sum>max) max=sum;
    if (sum<0) sum=0;
   }
  }
 printf("%d/n",max);
 return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值