首页 > 其他分享 >P1719 最大加权矩形

P1719 最大加权矩形

时间:2024-11-16 22:57:43浏览次数:1  
标签:加权 P1719 temp int max right 数组 矩形

题目描述

为了更好的备战 NOIP2013,电脑组的几个女孩子 LYQ,ZSC,ZHQ 认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没有马上答应他们,而是先给她们出了一道数学题,并且告诉她们:你们能获得的运动场地的面积就是你们能找到的这个最大的数字。

校长先给他们一个n*n 矩阵。要求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于 [-127,127],例如

 0 –2 –7  0 
 9  2 –6  2
-4  1 –4  1 
-1  8  0 –2

在左下角:

9  2
-4  1
-1  8

和为 15。

几个女孩子有点犯难了,于是就找到了电脑组精打细算的 HZH,TZY 小朋友帮忙计算,但是遗憾的是他们的答案都不一样,涉及土地的事情我们可不能含糊,你能帮忙计算出校长所给的矩形中加权和最大的矩形吗?

输入格式

第一行:n,接下来是 n 行 n 列的矩阵。

输出格式

最大矩形(子矩阵)的和。

样例 #1

样例输入 #1

4
0 -2 -7 0
 9 2 -6 2
-4 1 -4  1 
-1 8  0 -2

样例输出 #1

15

提示

1 <=n<=120

Kadane算法

这是一个经典的求解一维最大子数组和的算法,时间复杂度是 O(n)。
过程:我们遍历所有可能的左右边界(列),将这两列之间的所有行元素累加起来形成一个新的数组。
对于每一个累加的数组,应用 Kadane 算法来寻找这个一维数组的最大子数组和。

代码示例

#include <iostream>
#include <climits>
using namespace std;

// Kadane算法:求一维数组中连续子数组的最大和
int kadane(int arr[], int n) {
    int max_so_far = arr[0];
    int max_ending_here = 0;
    
    for (int i = 0; i < n; i++) {
        max_ending_here += arr[i];
        if (max_ending_here > max_so_far) {
            max_so_far = max_ending_here;
        }
        if (max_ending_here < 0) {
            max_ending_here = 0;
        }
    }
    return max_so_far;
}

// 求最大加权矩形的和,这是主要的求解函数,它通过枚举所有的列对 (left, right),并将这两列之间的元素累加到 temp 数组中。然后在 temp 数组上应用 Kadane 算法,计算该区域内最大加权矩形的和。
int maxSum(int matrix[][120], int n) {
    int max_sum = INT_MIN;

    // 遍历所有列对 (left, right)
    for (int left = 0; left < n; ++left) {
        int temp[120] = {0};  // 存储每列加和后的临时数组
        
        for (int right = left; right < n; ++right) {
            // 将从left列到right列的每行元素累加到temp数组
            for (int i = 0; i < n; ++i) {
                temp[i] += matrix[i][right];
            }
            
            // 在temp数组上应用Kadane算法,找出最大和
            int current_max = kadane(temp, n);
            max_sum = max(max_sum, current_max);  // 更新全局最大和
        }
    }
    
    return max_sum;
}

int main() {
    int n;
    cin >> n;
    
    int matrix[120][120];
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> matrix[i][j];
        }
    }

    // 输出最大加权矩形的和
    cout << maxSum(matrix, n) << endl;

    return 0;
}

标签:加权,P1719,temp,int,max,right,数组,矩形
From: https://www.cnblogs.com/Xuxuan18/p/18550066

相关文章

  • luogu P1719 最大加权矩形
    最大加权矩形题目描述为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没有马上答应他们,而是先给她们出了一道数学题,并且告诉她们:你们能获得的运动场地的......
  • 最大加权矩形
    最大加权矩形题目描述为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没有马上答应他们,而是先给她们出了一道数学题,并且告诉她们:你们能获得的运动场地的......
  • 抽奖-随机加权算法
    packagelotteryimport( "fmt" "math/rand" "sort" "time")typeLotterystruct{}funcNewLottery()*Lottery{ return&Lottery{}}typePrizestruct{ Namestring Stockint Weightint//权重}//......
  • LeetCode 836[矩形重叠]
    题目链接LeetCode836[矩形重叠]详情实例提示题解思路无重叠的四种情况:第二个矩形的右边边如果在第一个矩形的左边边的左边或重叠第二个矩形的左边边如果在第一个矩形的右边边的右边或重叠第二个矩形的上边边如果在第一个矩形的下边边的下边或重叠第二个矩形的下......
  • 两步加权最小二乘,定位三维目标、N个锚点(锚点数量不限,多于3个即可)
    提供一个MATLAB代码:基于两步加权最小二乘法的三维目标定位算法,利用多个锚点(基站)和时间差到达(TDOA)数据来估计未知目标的位置【可更改锚点数量、位置、待定位点的位置】文章目录代码功能概述运行结果源代码代码结构和详细说明总结代码功能概述该MATLAB代码通过模拟......
  • 85. 最大矩形
    题目链接解题思路暴力怎么做?我们可以枚举,矩阵的底,必须是第0行,求一个最大值,矩阵的底,必须是第1行,求一个最大值,把所有的都得到,然后最大的那个,就是结果。依次类推,所有结果的最大值,就是全局最优解举个例子,假设矩阵[ [1,0,1,0,0], [1,0,1,1,1], [1,1,1,1,......
  • 84. 柱状图中最大的矩形
    题目链接解题思路:题目乍一看没有思路,那我们来想一想如果暴力求解怎么办。最大的矩形,他总有一个高(竖着的),然后有一个宽(横着的),那我们就暴力求解每一个高,也就是每一个下标i,对应的heights[i],最大的宽是多少,然后求出所有的解后,最优的便是结果。怎么求解以heights[i]为高,最大......
  • 全零子矩形计数问题
    经典问题,但是我为什么不会呢?????题意给定一张\(n\timesm\)的01矩阵,求出有多少个子矩阵使得子矩阵内没有1。\(n,m\le10^3\)分析考虑枚举每一行,计算以该行上每个点为右下角的合法子矩形个数\(\sumsum_{i,j}\),也就是说,计算左上角的个数使得左上角和该右下角形成的子矩形不......
  • Leetcode 3235. 判断矩形的两个角落是否可达
    1classSolution{2public:3boolcanReachCorner(intxCorner,intyCorner,vector<vector<int>>&circles){4vector<bool>visited(circles.size(),false);56function<bool(int)>dfs=[&](inti)......
  • 力扣21 打卡16 判断矩形的两个角落是否可达
    思路:首先,检查矩形的起点和终点是否在任何一个圆的范围内,如果是则不存在合法路径。接着,判断每个圆是否与矩形的左上角边界或右下角边界相交。对于与左上边界相交的圆,使用深度优先搜索(DFS),查找是否存在一组相连的圆,最终能连接到右下边界。若找到这样的路径,则矩形被封锁,返回Fa......