题目1139:最大子矩阵

#include <stdio.h>  
#include <stdlib.h>  
#define MAX 110  
   
int MaxSubMerticx(int *a,int N)  //一维最大序列和问题  
{  
    int max,dp[MAX],i;  
   
    max=a[0];  
    dp[0]=a[0];  
    for(i=1;i<N;i++)  
    {  
        dp[i]=(dp[i-1]+a[i])>a[i]?(dp[i-1]+a[i]):a[i];  //最长子序列  
        if(dp[i]>max)  
            max=dp[i];  
    }  
    return max;  
}  
   
int main()  
{  
    //  
    int N,metricx[MAX][MAX],dp[MAX],sum,max;  
    int i,j,k;  
   
   
   
    while(scanf("%d",&N)!=EOF)  
    {  
        for(i=0;i<N;i++)  
            for(j=0;j<N;j++)  
                scanf("%d",&metricx[i][j]);  
   
        max=metricx[0][0];  
        for(i=0;i<N;i++)       //从第i行开始向下,依次枚举所有可能的矩阵  
        {  
            for(j=0;j<N;j++)  //保存从第i行到第j行的列和,相当于纵向压缩,将矩阵列压缩为一个点,从而将最大子矩阵(二维,纵向+横向)转换为最大序列和(一维,纵向一定,横向最大),达到降维的目的  
                dp[j]=0;  
   
            for(j=i;j<N;j++)  
            {  
                for(k=0;k<N;k++)   //计算到达j行为止的每一列的和  
                    dp[k]+=metricx[j][k];  
   
                sum=MaxSubMerticx(dp,N);   //求出在纵向为从i到j行,横向为0-N的最大横向方向子序列  
                if(sum>max)  
                    max=sum;     //更新全局最优解  
            }  
        }  
   
        printf("%d\n",max);  
    }  
    return 0;  
}  
/**************************************************************
    Problem: 1139
    User: cust123
    Language: C++
    Result: Accepted
    Time:50 ms
    Memory:1020 kb
****************************************************************/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值