• [P3625][APIO2009]采油区域 (前缀和)


    这道题用二维前缀和可以做

    难度还不算高,细节需要注意

    调试了很久……

    主要是细节太多了

    #include<bits/stdc++.h>
    using namespace std;
    #define max(a,b) (a>b?a:b)
    #define min(a,b) (a<b?a:b)
    #define ll long long
    #define N 1505
    inline int read() {
        int f = 1, x = 0; char ch;
        do { ch = getchar(); if (ch == '-')f = -1; } while (ch<'0' || ch>'9');
        do { x = x * 10 + ch - '0'; ch = getchar(); } while (ch >= '0'&&ch <= '9');
        return f * x;
    }
    int m, n, k, ans;
    int s[N][N],a[N][N],b[N][N],c[N][N],d[N][N];
    int main()
    {
        n = read(), m = read(), k = read();
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                int t = read();
                s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + t;
            }
        }
        for (int i = n; i >= k; i--)
            for (int j = m; j >= k; j--)
                s[i][j] -= s[i - k][j] + s[i][j - k] - s[i - k][j - k];
        for (int i = k; i <= n; i++)
            for (int j = k; j <= m; j++)
                a[i][j] = max(s[i][j], max(a[i - 1][j], a[i][j - 1]));
        for (int i = k; i <= n; i++)
            for (int j = m; j >= k; j--)
                b[i][j] = max(s[i][j], max(b[i][j + 1], b[i - 1][j]));
        for (int i = n; i >= k; i--)
            for (int j = k; j <= m; j++)
                c[i][j] = max(s[i][j], max(c[i][j - 1], c[i + 1][j]));
        for (int i = n; i >= k; i--)
            for (int j = m; j >= k; j--)
                d[i][j] = max(s[i][j], max(d[i][j + 1], d[i + 1][j]));
    
        for (int i = k; i <= n - k; i++)//1
            for (int j = k; j <= m - k; j++)
                ans = max(ans, a[i][j] + b[i][j + k] + c[i + k][m]);
        for (int i = k + k; i <= n; i++)//2
            for (int j = k; j <= m - k; j++)
                ans = max(ans, c[i][j] + d[i][j + k] + a[i - k][m]);
        for (int i = k + k; i <= n - k; i++)//6
            for (int j = k; j <= m; j++)
                ans = max(ans, s[i][j] + a[i - k][m] + c[i + k][m]);
        for (int i = k; i <= n - k; i++)//3
            for (int j = k; j <= m - k; j++)
                ans = max(ans, a[i][j] + c[i + k][j] + b[n][j + k]);
        for (int i = k; i <= n - k; i++)//4
            for (int j = k + k; j <= m; j++)
                ans = max(ans, a[n][j - k] + b[i][j] + d[i + k][j]);
        for (int i = k; i <= n - k; i++)//5
            for (int j = k + k; j <= m - k; j++)
                ans = max(ans, s[i][j] + a[n][j - k] + b[n][j + k]);
        cout << ans;
        return 0;
    }
  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/lincold/p/9818847.html
Copyright © 2020-2023  润新知