第一轮 K

Maximum Sum
Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
Submit Status

Description
Given a 2-dimensional array of positive and negative integers, find the sub-rectangle with the largest sum. 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. A sub-rectangle is any contiguous sub-array of size 1 × 1 or greater located within the whole array.
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-hand corner and has the 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 white-space (newlines and spaces). These N 2 integers make up the array in row-major order (i.e., all numbers on the first row, left-to-right, then all numbers on 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
The output is the sum of the maximal sub-rectangle.

Sample Input
input	output

4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

	

15

最大子矩阵,不说了~
/*************************************************************************
	> File Name: k.cpp
	> Author:yuan 
	> Mail: 
	> Created Time: 2014年11月09日 星期日 22时38分42秒
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int mat[107][107];
int sum[107],dp[107];
int n,ans;
int main()
{
    while(~scanf("%d",&n)){
        memset(mat,0,sizeof(mat));
        memset(sum,0,sizeof(sum));
        ans=-0x3ffffff;
        int m=0;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
        {
            scanf("%d",&mat[i][j]);
        }
        for(int i=1;i<=n;i++)
          for(int j=i;j<=n;j++)
        {
            memset(sum,0,sizeof(sum));
            for(int k=i;k<=j;k++)
            {
                for(int l=1;l<=n;l++)
                  sum[l]+=mat[k][l];
            }
            memset(dp,0,sizeof(dp));
            for(int k=1;k<=n;k++)
            {
                if(dp[k-1]<0) dp[k]=sum[k];
                else dp[k]=dp[k-1]+sum[k];
                ans=max(ans,dp[k]);
            }
        }
        printf("%d
",ans);
   }
    return 0;
}


原文地址:https://www.cnblogs.com/codeyuan/p/4254397.html