最大子阵

  历届试题 最大子阵  
时间限制: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