【每日一题】3.数学考试 (前缀和,线性DP)

题目链接:Here

思路:区间求和问题可以想到一个常用算法。前缀和。区间 [l,r] 的和可以用 sumrsuml 方便求出

由于区间长度 k 已知,所以我们可以直接选择暴力枚举两个区间的起点然后利用前缀和快速求和。

具体细节如下:

直接从 k 出发,用 cnt 比较出 k 之前最大区间和,用 ans 比较出 k 之后的最大区间和

  • 时间复杂度:O(N)

注意点:数据范围较大,注意使用 long long

using ll = long long;
using namespace std;
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    int _;
    for (cin >> _; _--;) {
        int n, k;
        cin >> n >> k;
        vector<ll> a(n + 2);
        for (int i = 1; i <= n; ++i) cin >> a[i], a[i] = a[i - 1] + a[i];
        ll ans = -1e18, cnt = -1e18;
        for (int i = k; i + k <= n; ++i) {
            cnt = max(cnt, a[i] - a[i - k]);
            ans = max(ans, cnt + a[i + k] - a[i]);
        }
        cout << ans << "\n";
    }
    return 0;
}

当然这道题不仅仅是枚举起点一种解法,也可以用线性 DP

在我们预处理完前缀和后,如何获得某个位置之和的最大区间呢?我们可用线性 DP 求得,设 f1i 表示位置 i 之前的最大区间和,而 f2i 表示 i 之后的最大区间和。

  • f1i=max(f1i1,sumisumik)
  • f2i=max(f2i+1,sumi+k1sumi1)
using ll = long long;
using namespace std;
const int N = 2e5 + 10;
ll f1[N], f2[N];
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    int _;
    for (cin >> _; _--;) {
        int n, k;
        cin >> n >> k;
        vector<int> a(n + 1);
        vector<ll> sum(n + 1, 0);
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
            sum[i] = a[i] + sum[i - 1];
        }
        memset(f1, -127, sizeof f1);
        memset(f2, -127, sizeof f2);
        for (int i = k; i <= n - k; ++i)
            f1[i] = max(sum[i] - sum[i - k], f1[i - 1]);
        for (int i = n - k + 1; i >= k + 1; --i)
            f2[i] = max(sum[i + k - 1] - sum[i - 1], f2[i + 1]);
        ll ans = -1e18;

        for (int i = k; i <= n - k; ++i)
            ans = max(ans, f1[i] + f2[i + 1]);
        cout << ans << "\n";
    }
    return 0;
}

最后是不是感觉代码二是代码一的详细版本?

本质上两个代码是一样的(代码一在空间上更优),这里只是稍微展开来。

posted @   RioTian  阅读(53)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
点击右上角即可分享
微信分享提示