P8218 【深进1.例1】求区间和 P1719 最大加权矩形

简介: P8218 【深进1.例1】求区间和 P1719 最大加权矩形

P8218 【深进1.例1】求区间和

题目描述

运行代码

#include <iostream>
#include <vector>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    vector<int> p(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        p[i] = p[i - 1] + a[i - 1];
    }
    int m;
    cin >> m;
    for (int i = 0; i < m; ++i) {
        int l, r;
        cin >> l >> r;
        cout << p[r] - p[l - 1] << endl;
    }
    return 0;
}

代码思路

  • 输入与初始化:
  • 首先,程序读入一个整数 n,表示数列的长度。
  • 然后,定义一个整数向量 a 存储数列元素,并通过循环按顺序读入 n 个正整数到向量 a 中。
  • 初始化一个大小为 n+1 的整数向量 p(前缀和数组),所有元素初值设为0。这个数组比原数组多一位,是为了方便计算区间和时避免边界条件的特殊处理。
  • 计算前缀和:
  • 通过一个循环,计算从第一个元素到第 n 个元素的累计和,存储在向量 p 中。具体地,p[i] 存储的是 a[0]a[i-1] 的和。这里 p[0] 设为0,是一个方便计算的基点。
  • 处理区间查询:
  • 接着,程序读入整数 m,表示要查询的区间数量。
  • 对于每一个查询,程序读入区间左右端点 lr
  • 区间和可以通过前缀和快速计算得到:区间 [l, r] 的和等于 p[r] - p[l-1]。这是因为 p[r] 是从第一个元素累加到第 r 个元素的和,而 p[l-1] 是从第一个元素累加到第 l-1 个元素的和,两者的差正好是 [l, r] 区间内所有元素的和。
  • 程序输出计算得到的区间和,并继续处理下一个查询,直到所有查询完成。

实现了对任意给定区间 [l_i, r_i] 的区间和查询,时间效率高,适合处理大量区间查询的问题。

P1719 最大加权矩形

题目描述

运行代码

#include <bits/stdc++.h> 
using namespace std;  
int main() {  
    int n;  
    cin >> n;  
    vector<vector<int>> FN(n, vector<int>(n));  
    vector<vector<int>> FF(n + 1, vector<int>(n + 1, 0)); 
    for (int i = 0; i < n; ++i) {  
        for (int j = 0; j < n; ++j) {  
            cin >> FN[i][j];  
            FF[i + 1][j + 1] = FF[i][j + 1] + FF[i + 1][j] - FF[i][j] + FN[i][j];  
        }  
    }  
    int m = INT_MIN;  
    // 枚举所有可能的子矩阵边界  
    for (int i1 = 0; i1 <= n; ++i1) {  
        for (int j1 = 0; j1 <= n; ++j1) {  
            for (int i2 = i1; i2 < n; ++i2) {  
                for (int j2 = j1; j2 < n; ++j2) {  
                    int sum = FF[i2 + 1][j2 + 1] - FF[i1][j2 + 1] - FF[i2 + 1][j1] + FF[i1][j1];  
                    m = max(m, sum);  
                }  
            }  
        }  
    }  
    cout << m << endl;  
    return 0;  
}

代码思路

  • 输入部分
  • 首先,代码读取矩阵的维度 n
  • 然后,定义了两个二维向量 FNFFFN 用于存储输入的原始矩阵,而 FF 用于存储前缀和矩阵。注意,FF 的维度比 FN 多1,这是因为前缀和矩阵需要多一行和一列来存储从 (0, 0)(i, j) 的和。
  • 接下来,代码通过两个嵌套的循环读取 FN 中的每个元素,并同时计算 FF 中的对应前缀和。
  • 计算前缀和
  • 前缀和矩阵 FF 的每个元素 FF[i+1][j+1] 存储了从 (0, 0)(i, j) 的矩形区域中所有元素的和。这是通过累加 FN 中相应位置的元素和从左上角、上方和左方到达 (i, j) 的前缀和来计算的。
  • 使用 FF[i + 1][j + 1] = FF[i][j + 1] + FF[i + 1][j] - FF[i][j] + FN[i][j]; 这个公式,可以在 O(1) 时间复杂度内得到任何 (i, j) 位置的前缀和。
  • 寻找最大加权矩形
  • 代码通过四个嵌套的循环枚举了所有可能的子矩阵边界(i1, j1 为左上角坐标,i2, j2 为右下角坐标)。
  • 对于每一对边界,它使用前缀和矩阵 FF 来计算子矩阵的和。具体来说,子矩阵的和是 FF[i2 + 1][j2 + 1] - FF[i1][j2 + 1] - FF[i2 + 1][j1] + FF[i1][j1]
  • 如果这个和大于当前记录的最大和 m,则更新 m
  • 输出结果:最后,代码输出找到的最大加权矩形的和 m

时间复杂度相对较低(尽管在这个特定实现中是 O(n^4)),因为它避免了直接计算每个子矩阵的和,而是通过前缀和矩阵在常数时间内得到子矩阵的和。对于非常大的矩阵,可能还需要进一步优化算法来降低时间复杂度。

目录
相关文章
|
存储 人工智能 安全
《数据主权:人工智能时代的核心基石与挑战》
在数字化时代,人工智能成为社会变革的强大力量,深刻改变着我们的生活方式。数据主权作为其核心基石,涉及国家、企业和个人的数据管辖与控制权。国家层面,数据主权关乎国家安全与经济竞争力;企业层面,合规利用数据可提升竞争力,但也面临法律风险;个人层面,隐私保护至关重要。国际社会正通过法规和技术手段(如GDPR和区块链)应对这些挑战,以确保数据安全与隐私,推动人工智能健康发展。
441 18
|
人工智能 弹性计算 运维
通勤路上修故障?钉钉机器人+OOS AI助手实现7×24小时运维自由
通过钉钉机器人配置阿里云OOS AI助手,您可以直接在钉钉群内发送文字指令,实现免登录、跨设备、秒级响应的阿里云运维操作。
|
测试技术 开发工具 git
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
为了高效地发现、定位和解决预发问题,闲鱼团队研发了一套异常日志问题自动追踪-定位-分发机制。这套机制通过自动化手段,实现了异常日志的定时扫描、精准定位和自动分发,显著降低了开发和测试的成本,提高了问题解决的效率。
638 15
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
|
Java 应用服务中间件 编译器
详解JAVA远程debug
详解JAVA远程debug
835 0
|
安全 算法 BI
【1号防红网】盘点几个安全可靠的防红短链接服务
【1号防红网】防红短链接服务,短链接API接口
957 0
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
433 2
|
消息中间件 存储 负载均衡
RocketMQ 消息的顺序和重复
这篇文章探讨了RocketMQ中消息顺序和重复的问题,解释了为什么RocketMQ不保证消息顺序和不重复,并提供了解决这些问题的策略,包括消费端幂等性处理和使用日志表记录已处理消息ID,同时介绍了RocketMQ的事务消息、Producer和Consumer的最佳实践,以及其他配置和RocketMQ的基本概念。
560 0
RocketMQ 消息的顺序和重复
|
机器学习/深度学习 计算机视觉 网络架构
是VGG网络的主要特点和架构描述
是VGG网络的主要特点和架构描述:
490 1
|
Serverless 云计算 Python
基本技术指标 Python 实现(1)
基本技术指标 Python 实现
717 3

热门文章

最新文章

下一篇
开通oss服务