首页 > 其他 > 详细

DP-最大子矩阵

时间:2021-01-19 23:35:14      阅读:56      评论:0      收藏:0      [点我收藏+]

1768:最大子矩阵

题目描述:

 描述已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵比如,如下4 * 4的矩阵


0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

的最大子矩阵是

9 2
-4 1
-1 8

这个子矩阵的大小是15。

输入
输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)
给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127, 127]。

样例输入
4
0 -2 -7 0 9 2 -6 2
-4 1 -4  1 -1

8  0 -2
样例输出
15

 

参考:https://www.cnblogs.com/shadowland/p/5870382.html

枚举子矩阵时先确定最左侧一列和最右一列,即左右边界,然后把子矩阵每一行的值求和,压缩成一个一维数组,对这个数组求最大字段和。  

i=1

        技术分享图片      技术分享图片     技术分享图片    技术分享图片

i=2

       技术分享图片        技术分享图片      技术分享图片

 

源代码:

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
   int a[105][105],dp[105]={0};
   int n;
   cin>>n;
   for(int i=1;i<=n;i++)
   {
       for(int j=1;j<=n;j++)
       {
           cin>>a[i][j];
       }
   }
   int ans=-1e10;
   for(int i=1;i<=n;i++)
   {
       memset(dp,0,sizeof(dp));
       for(int j=i;j<=n;j++)//从第i列开始的情况
       {
           int t=0;
           for(int k=1;k<=n;k++)//相加第j行
           {
               dp[k]+=a[j][k];

               if(t<=0)//累加值已变为负,要求最大值删去之前的累加值
               {
                   t=dp[k];
               }
               else
               {
                   t+=dp[k];
               }
               if(t>ans)
               {
                   ans=t;
               }
           }

       }

   }
   cout<<ans<<endl;
   return 0;
}

 

DP-最大子矩阵

原文:https://www.cnblogs.com/qq-1423406156/p/14300471.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!