zoukankan      html  css  js  c++  java
  • 【poj1050】 To the Max

    http://poj.org/problem?id=1050 (题目链接)

    题意

      求二维最大子矩阵

    Solution

      数据好像很水,N最大才100,N^4大暴力都可以随便水过。

      其实有N^3的做法。枚举矩阵上下边界,然后把中间的一大坨看作是一维的一条直线,O(n)的做最长子段和即可。当然记得要预处理出前缀和。

    代码

    // poj1050
    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #define LL long long
    #define inf 2147483640
    #define Pi 3.1415926535898
    #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
    using namespace std;
    
    int n,a[1010][1010],sum[1010][1010];
    
    int main() {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++) scanf("%d",&a[i][j]),sum[i][j]=a[i][j]+sum[i][j-1];
        int ans=-inf;
        for (int i=1;i<=n;i++)
            for (int j=i;j<=n;j++) {
                int s=0;
                for (int k=1;k<=n;k++) {
                    s+=sum[k][j]-sum[k][i-1];
                    if (s<0) s=0;
                    else ans=max(ans,s);
                }
            }
        printf("%d",ans);
        return 0;
    }
    

      

  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/5914358.html
Copyright © 2011-2022 走看看