很久很久以前的代码,在某个角落找到,贴了上来,
在杭电acm1081上可以ac,来源应该是Greater New York 2001
貌似作为中南赛区ACM竞赛题
问题描述
【Description】
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
【Input】
The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].
【Output】
Output the sum of the maximal sub-rectangle.
【Sample Input】
4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
8 0 -2
【Sample Output】
15
下面的中文来自:http://blog.csdn.net/hym666/archive/2010/08/17/5818591.aspx
此文章处有C++的解答
题目描述:
在一个大的方阵中找出一个子方阵,这个子方阵是所有子方阵和中的最大的一个
问题分析:
问题可以回归到一个数列中的连续字数列的和的最大值。
即把每一行看成一个数列。把每一列转换成一个数。
当然每一列也是一个数列,有很多的连续子数列。所有会有很多中情况。可穷举各种数列来构造一个行向的数列。
再用动态规划计算每一行的最大值,再在各行中选取最大的作为题目的解。
【代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | import java.util.*; public class Main { /** * @param args */ public static int maxSum(int[] b, int n){ int max = b[0], sum = 0; for (int i = 1; i < n ; i++ ){ if (max > 0) max += b[i]; else max = b[i]; if (max > sum) sum = max; } return sum; } public static int maxTotal(int[][] a, int n){ int max = 0; int[] b = new int[n]; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++) b[j] = a[i][j]; int sum = maxSum(b, n); if (sum > max) max = sum; for (int j = i + 1; j < n; j++){ for (int k = 0; k < n; k++) b[k] += a[j][k]; sum = maxSum(b, n); if (sum > max) max = sum; } } return max; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner cin = new Scanner(System.in); int n; while (cin.hasNext()){ n = cin.nextInt(); int[][] a = new int[n][n]; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ a[i][j] = cin.nextInt(); } } System.out.println(maxTotal(a, n)); } } } |