蓝桥杯历届试题试题(2014) PREV-26 最大子阵

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

  给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。
  其中,A的子矩阵指在A中行和列均连续的一块。

输入格式

  输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
  接下来n行,每行m个整数,表示矩阵A。

输出格式

  输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。

样例输入

3 3
-1 -4 3
3 4 -1
-5 -2 8

样例输出

10

样例说明

  取最后一列,和为10。

数据规模和约定

  对于50%的数据,1<=n, m<=50;
  对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。

 1 #include<iostream>
 2 #include<string.h>
 3 #define ll long long int
 4 #define INF 0x3f3f3f3f
 5 using namespace std;
 6 int main(){
 7     int n,m;
 8     int num;
 9     int dp[505][505];
10     memset(dp,0,sizeof(dp));
11     cin>>n>>m;
12     for(int i=1;i<=n;i++){
13         for(int j=1;j<=m;j++){
14             cin>>num;
15             dp[i][j]=dp[i-1][j]+num;
16             
17         }
18     }
19     int temp;
20     int ans;
21     int maxx=-INF;
22     for(int base=1;base<=n;base++){
23         for(int top=1;top<=base;top++){
24 
25             temp=0;
26             for(int left=1;left<=m;left++){
27                 temp+=dp[base][left]-dp[top-1][left];
28                 if(temp>maxx){
29                     maxx=temp;
30                 }
31                 if(temp<0)//如果前面的temp计算的值为负数,只会造成后续计算的值的减少
32                          //对于求最大的值没有意义,那么就令其为0,从下一列重新计算
33                          //另外,举一反三,如果求最小值,temp为负数对求最小值有贡献,
34                          //那么就要当temp>0时,令temp=0
35                     temp=0;
36             }
37 
38         }
39     }
40     cout<<maxx<<endl; 
41 }

猜你喜欢

转载自www.cnblogs.com/memocean/p/12790140.html
今日推荐