ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Maximum Exploitation - ieeextreme15

2021-10-28 20:32:39  阅读:204  来源: 互联网

标签:q1 q2 int max sum Maximum Exploitation ieeextreme15 ll


这题其实并不难,比赛的时候自己脑子就是转不动==

题目大意:
有一个RxC的矩阵,用最多两个rxc的矩形去框这个矩阵,使覆盖的数字之和最大,输出最大值
1<=R,C<=1000

解题思路:
预处理以(i,j)为右下角顶点,(0,0)为左上角顶点范围内的 形状为rxc矩形所能覆盖的最大值p[i][j]
预处理以(i,j)为左上角顶点,(R,C)为右下角顶点范围内的 形状为rxc矩形所能覆盖的最大值q[i][j]
遍历就完事了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3 + 3;
int mz[N][N];
ll q1[N][N], q2[N][N], p1[N][N], p2[N][N], sum[N][N];
ll getsum(int a, int b, int c, int d)
{
    return sum[c][d] - sum[c][b - 1] - sum[a - 1][d] + sum[a - 1][b - 1];
}
int main()
{
    int n, m;
    int a, b;
    scanf("%d%d", &n, &m);
    scanf("%d%d", &a, &b);
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            scanf("%d", &mz[i][j]);
            sum[i][j] = -sum[i - 1][j - 1] + sum[i - 1][j] + sum[i][j - 1] + mz[i][j];//矩形((0,0),(i,j))的元素和
        }
    }

    for (int i = a; i <= n; i++)
    {
        for (int j = b; j <= m; j++)
        {
            p1[i][j] = max(p1[i][j - 1], p1[i - 1][j]);
            p1[i][j] = max(p1[i][j], getsum(i - a + 1, j - b + 1, i, j));
        }
    }
    for (int i = b; i <= n; i++)
    {
        for (int j = a; j <= m; j++)
        {
            p2[i][j] = max(p2[i][j - 1], p2[i - 1][j]);
            p2[i][j] = max(p2[i][j], getsum(i - b + 1, j - a + 1, i, j));
        }
    }
    //
    for (int i = n - a + 1; i >= 0; i--)
    {
        for (int j = m - b + 1; j >= 0; j--)
        {
            q1[i][j] = max(q1[i][j + 1], q1[i + 1][j]);
            q1[i][j] = max(q1[i][j], getsum(i, j, i + a - 1, j + b - 1));
        }
    }
    for (int i = n - b + 1; i >= 0; i--)
    {
        for (int j = m - a + 1; j >= 0; j--)
        {
            q2[i][j] = max(q2[i][j + 1], q2[i + 1][j]);
            q2[i][j] = max(q2[i][j], getsum(i, j, i + b - 1, j + a - 1));
        }
    }
    ll ans = 0;
    for (int i = min(a, b); i <= n; i++)
    {
        for (int j = min(a, b); j <= m; j++)
        {
            ll mxp = max(p1[i][j], p2[i][j]);
            ll mxq1 = max(q1[1][j + 1], q1[i + 1][1]);
            ll mxq2 = max(q2[1][j + 1], q2[i + 1][1]);
            ans = max(ans, mxp + max(mxq1, mxq2));
        }
    }
    printf("%lld\n", ans);
    return 0;
}
/*Verdict: 100 points

Language: C++

CPU Time usage: 169 ms

Memory usage: 34.5 MB*/

标签:q1,q2,int,max,sum,Maximum,Exploitation,ieeextreme15,ll
来源: https://www.cnblogs.com/yuesalianzhou/p/15477584.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有