http://poj.org/problem?id=1050
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
Source
题意:
求矩阵中小矩形和的最大值。
看了题解才明白,dp还是要不断强化。
1、预处理出第i行前j个数的和
2、然后枚举每一个小矩形,在怎么枚举这方面我原先也不明白,看了题解才知道。第一层是列数1--n,第二层是i--n,第三层是行数枚举1--n。然后利用一维最长子序列和知识,我们看sum的值,若<0,则变为0,同时更新最大值的值。dpkj-dpk(i-1)就是枚举一个个小矩形。
3、可以看出每次都是固定的两列,然后累加行。
import java.util.Scanner;
public class Main4 {
static int dp[][]=new int[101][101];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
int n;
n=cin.nextInt();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int tem;
tem=cin.nextInt();
dp[i][j]=tem+dp[i][j-1];//预处理第i行前j个数前缀和
}
}
int maxx=-9999;
int sum;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
sum=0;
for(int k=1;k<=n;k++)
{
sum+=dp[k][j]-dp[k][i-1];
sum=sum<0?0:sum;
maxx=maxx>sum?maxx:sum;
}
}
}
System.out.println(maxx);
}
}