zoukankan      html  css  js  c++  java
  • 第一轮 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;
    }
    


  • 相关阅读:
    提问回顾与个人总结
    软工结对作业
    软件工程第一次阅读作业
    软件工程第0次作业
    oo第四次博客总结
    第三次博客总结
    第二次博客作业
    OO第一次总结博客
    软工第二次作业
    软工第一次作业
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254397.html
Copyright © 2011-2022 走看看