洛谷P1719_最大加权矩阵和模板

本文介绍了一种求解二维矩阵中最大子矩阵和的方法,通过动态规划算法实现了高效的求解过程。具体步骤包括:首先对矩阵的每行进行累加得到临时数组,然后针对每个可能的行区间,使用一维动态规划找出最大子序列和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 122;
const int INF = 2147483640;

int dp[maxn], temp[maxn];
int a[maxn][maxn];
int n;

int solve();

int main()
{
    scanf("%d", &n);
    int i, j;
    for(i = 1; i <= n; ++i)
        for(j = 1; j <= n; ++j)
    {
        scanf("%d", &a[i][j]);
    }
    int ans = solve();
    printf("%d\n", ans);
    return 0;
}

int solve()
{
    int i, j, k;
    int ret = -INF;
    for(i = 1; i <= n; ++i)//枚举行的起点
    {
        memset(temp, 0, sizeof(temp));
        for(j = i; j <= n; ++j)//枚举行的终点
        {
            for(k = 1; k <= n; ++k)//i~j行,第k列的值,压缩维度
                temp[k] += a[j][k];
            memset(dp, 0, sizeof(dp));
            for(k = 1; k <= n; ++k)//dp_最长连续子序列和
            {
                dp[k] = max(temp[k], dp[k-1]+temp[k]);
                ret = max(ret, dp[k]);l
            }
        }
    }
    return ret;
}

### 洛谷 P1719 最大加权矩形 Python 解题思路 对于洛谷 P1719 最大加权矩形问题,可以采用动态规划结合前缀的方式求解。通过构建二维前缀来加速区间查询效率,进而简化计算过程。 #### 动态规划状态定义 设 `dp[i][j]` 表示以第 i 行 j 列结尾的最大矩阵权重,则有: \[ dp[i][j]=\max \left(a_{i,j}, a_{i,j}+\sum _{k=0}^{i-1}\sum _{l=j-w+1}^{j}a[k][l]\right)[^1] \] 为了提高效率,在实际编程中会先预处理出每一列的高度范围内的累积高度值,再利用这些信息更新 DP 数中的最优解。 #### 前缀优化 考虑到直接枚举所有可能的子矩阵时间复杂度过高,因此引入一维前缀辅助结构降低运算量。具体来说就是维护一个临时变量记录当前正在考察的一行内连续若干列构成区间的累加值,并不断调整起始位置直到找到全局最大值为止。 ```python def max_weight_rectangle(matrix): rows, cols = len(matrix), len(matrix[0]) # 计算每行的前缀 prefix_sum = [[0] * (cols + 1) for _ in range(rows)] for r in range(rows): for c in range(cols): prefix_sum[r][c + 1] = prefix_sum[r][c] + matrix[r][c] result = float('-inf') # 枚举上下边界 for top in range(rows): temp_row_sums = [0] * cols for bottom in range(top, rows): # 更新当前层的累计高度 for col in range(cols): temp_row_sums[col] += matrix[bottom][col] current_max_subarray = kadane_algorithm(temp_row_sums) result = max(result, current_max_subarray) return result def kadane_algorithm(nums): """Kadane's algorithm to find the maximum subarray sum""" best_sum = current_sum = nums[0] for num in nums[1:]: current_sum = max(num, current_sum + num) best_sum = max(best_sum, current_sum) return best_sum ``` 此算法的时间复杂度主要取决于两重循环遍历所有的上界下界的合以及调用一次 Kadane 算法 O(n),总体为 \(O(N^3)\),其中 N 是输入矩阵较小维度大小。空间复杂度则由存储前缀所需额外开销决定,即 \(O(MN)\),M N 分别代表给定网格的高度与宽度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值