【蓝桥杯】历届试题 最大子阵(运行超时)

  历届试题 最大子阵  
时间限制: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。
 
 
以下是超时代码:
Java源代码:
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4 
 5     static int INF = 0x3f3f3f3f;
 6     static int MAXN = 550;
 7     static int[][] mp = new int[MAXN][MAXN];
 8     static int[] dp = new int[MAXN];
 9     static int mx;
10     static int m, n;
11 
12     static void solve(int[] a) {
13         int temp = 0;
14         for (int j = 0; j < n; j++) {
15             if (temp + a[j] < a[j])
16                 temp = a[j];
17             else
18                 temp += a[j];
19             mx = Math.max(mx, temp);
20         }
21     }
22 
23     public static void main(String[] args) {
24         Scanner sc = new Scanner(System.in);
25         m = sc.nextInt();
26         n = sc.nextInt();
27         mx = -INF;
28         for (int i = 0; i < m; i++)
29             for (int j = 0; j < n; j++)
30                 mp[i][j] = sc.nextInt();
31         for (int i = 0; i < m; i++) {
32             for (int j = 0; j < dp.length; j++) {
33                 dp[j] = 0;
34             }
35             for (int j = i; j < m; j++) {
36                 for (int k = 0; k < n; k++)
37                     dp[k] += mp[j][k];
38                 solve(dp);
39             }
40         }
41         System.out.println(mx);
42     }
43 }
评测点序号评测结果得分CPU使用内存使用下载评测数据
1 正确 10.00 156ms 24.62MB 输入 输出
2 正确 10.00 234ms 25.00MB 输入 输出
3 正确 10.00 296ms 29.43MB 输入 输出
4 正确 10.00 234ms 32.38MB 输入 输出
5 正确 10.00 343ms 34.98MB 输入 输出
6 运行超时 0.00 运行超时 87.85MB 输入 输出
7 运行超时 0.00 运行超时 98.69MB 输入 输出
8 运行超时 0.00 运行超时 115.7MB 输入 输出
9 运行超时 0.00 运行超时 87.36MB 输入 输出
10 运行超时 0.00 运行超时 124.4MB 输入 输出
原文地址:https://www.cnblogs.com/wuqianling/p/5370076.html