您的位置:首页 > 其它

hdu 1081 To The Max

2013-09-11 14:06 351 查看


To The Max

Time
Limit: 2000/1000 MS
(Java/Others)    Memory
Limit: 65536/32768 K (Java/Others)Total Submission(s):
3622    Accepted
Submission(s): 1721
Problem DescriptionGiven a two-dimensional array of positive and negative integers, a
sub-rectangle is any contiguous sub-array of size 1 x 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 09 2 -6 2-4 1 -4 1-1 8 0 -2is in the lower left corner:9 2-4 1-1 8and has a sum of 15. InputThe input consists of an N x 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]. OutputOutput the sum of the maximal sub-rectangle. Sample Input

0 -2
-7 0 
9 2 -6

-4 1
-4 1
-1 8 0
-2 Sample Output
15 题目的意思很简单,在一个矩阵里面找它的子矩阵,使得子矩阵数值之和到达最大。其实就是最大子段和问题在二维空间上的推广。考察下面题目中的例子:0  -2  -7  09  2  -6  2-4  1  -4   7-1  8  0   -2我们分别用i j表示起始行和终止行,遍历所有的可能:for(i=1;i<=n;i++)    for(j=i;j<=n;j++) {}我们考察其中一种情况 i=2 j=4,这样就相当与选中了2 3 4三行,求那几列的组合能获得最大值,由于总是 2 3 4行,所以我们可以将这3行”捆绑”起来,变为求 4(9-4-1),11(8+2+1),-10(-6-4+0),7(7+2-2)的最大子段和,ok,问题成功转化为一维的情况!代码写的有点乱,呼呼呼!!!!(借鉴了大牛的思路) #include<stdio.h>int
main(){int
N,i,j,k;int
a[105][105];int
b[105],max;while(scanf("%d",&N)!=EOF){max=0;for(i=0;i<N;i++){for(j=0;j<N;j++)scanf("%d",&a[i][j]);}for(i=0;i<N;i++){for(j=0;j<N;j++){if(i==j){ for(k=0;k<N;k++){b[k]=a[i][k];}}else{int
l;for(k=0;k<N;k++){b[k]=0;for(l=i;l<=j;l++){b[k]+=a[l][k];}}}int
temp=1,first,last;int
sum=0,maxnum=-1000000;for(k=0;k<N;k++){sum+=b[k];if(sum>maxnum){maxnum=sum;//first=temp;//last=k+1;}if(sum<0){sum=0;//temp=k+1;}}if(maxnum>max){max=maxnum;} }}printf("%d\n",max);} return
0;} 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: