To the Max POJ1050 二维dp

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

Greater New York 2001

题意:

求矩阵中小矩形和的最大值。

看了题解才明白,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);
	}

}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/88982703