zoukankan      html  css  js  c++  java
  • 简单DP+暴力 POJ 1050

    To the Max
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 45915   Accepted: 24282

    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
     1 /*这道题目n^3居然不会超时,暴力就好了*/
     2 #include<iostream>
     3 using namespace std;
     4 #include<cstdio>
     5 #define N 101
     6 int sum[N][N]={0},n,x;
     7 int main()
     8 {
     9     scanf("%d",&n);
    10     for(int i=1;i<=n;++i)
    11       for(int j=1;j<=n;++j)
    12       {
    13            scanf("%d",&x);
    14            sum[i][j]=sum[i][j-1]+x;/*sum[i][j]表示的是第i行前j个数的和*/
    15       }
    16     int ans=-(1<<30);
    17     for(int i=1;i<=n;++i)
    18       for(int j=i;j<=n;++j)/*暴力枚举每行区间*/
    19       {
    20           int tmp=0;/*tmp为当前矩阵的大小*/
    21           for(int k=1;k<=n;++k)/*枚举每一行*/
    22           {
    23               int que=sum[k][j]-sum[k][i-1];/*取出这一行*/
    24               if(tmp>0) tmp+=que;/*如果当前矩阵的大小已经<0了,那么再加上就要放弃之前的矩阵,放弃一定会更优*/
    25               else tmp=que;
    26               ans=max(ans,tmp);/*因为我们会随时放弃矩阵,所以最大值的更新,在循环中进行*/
    27           }
    28       }
    29     cout<<ans;
    30     return 0;
    31 }
  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5495574.html
Copyright © 2011-2022 走看看