首页 > 其他 > 详细

最大子阵

时间:2019-03-22 19:55:01      阅读:126      评论:0      收藏:0      [点我收藏+]
  历届试题 最大子阵  
时间限制: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 using namespace std;
 3 int main(){
 4     int dp[501][501] = {0};
 5     int n, m;
 6     cin >> n >> m;
 7     for(int i = 1; i <= n; i++){
 8         for(int j = 1; j <= m; j++){
 9             int t;
10             cin >> t;
11             //每一行存的是与上面行的和(上面所有行)
12             dp[i][j] += dp[i - 1][j] + t;
13         }
14     } 
15     int s = 0;
16     int max = -99999999;
17     for(int i = 1; i <= n; i++){
18         for(int j = i; j <= n; j++){
19             s = 0;
20             for(int k = 1; k <= m; k++){
21                 s += dp[j][k] - dp[i - 1][k];//按先按列走,然后按行数间隔递增的顺序(最外俩个循环) 
22                 if(s > max){
23                     max = s;
24                 } 
25                 if(s < 0){
26                     s = 0;
27                 }
28             }
29         }
30     } 
31     cout << max;
32     return 0;
33 }

 

最大子阵

原文:https://www.cnblogs.com/AGoodDay/p/10580506.html

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