【每日一题】3.数学考试 (前缀和,线性DP)
题目链接:Here
思路:区间求和问题可以想到一个常用算法。前缀和。区间 \([l,r]\) 的和可以用 \(sum_r - sum_l\) 方便求出
由于区间长度 \(k\) 已知,所以我们可以直接选择暴力枚举两个区间的起点然后利用前缀和快速求和。
具体细节如下:
直接从 \(k\) 出发,用 cnt 比较出 \(k\) 之前最大区间和,用 ans 比较出 \(k\) 之后的最大区间和
- 时间复杂度:\(\mathcal{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\) 求得,设 \(f1_i\) 表示位置 \(i\) 之前的最大区间和,而 \(f2_i\) 表示 \(i\) 之后的最大区间和。
- \(f1_i = max(f1_{i - 1} , sum_i - sum_{i - k})\)
- \(f2_i = max(f2_{i + 1},sum_{i + k - 1} - sum_{i - 1})\)
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;
}
最后是不是感觉代码二是代码一的详细版本?
本质上两个代码是一样的(代码一在空间上更优),这里只是稍微展开来。
【每日一题】3.数学考试 (前缀和,线性DP)的更多相关文章
- 【ACM算法竞赛日常训练】DAY2题解与分析【比赛】【数学考试】【简单瞎搞题】
DAY2共三题: 比赛(概率) 数学考试(前缀和与思维) 简单瞎搞题(dp) 视频讲解:https://www.bilibili.com/video/BV1hP411o7RD/ 作者:Eriktse ...
- 【python】Leetcode每日一题-前缀树(Trie)
[python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...
- NC15553 数学考试
NC15553 数学考试 题目 题目描述 今天qwb要参加一个数学考试,这套试卷一共有 \(n\) 道题,每道题qwb能获得的分数为 \(a_i\) ,qwb并不打算把这些题全做完, 他想选总共 \( ...
- 2018年长沙理工大学第十三届程序设计竞赛 H数学考试
链接:https://www.nowcoder.com/acm/contest/96/H来源:牛客网 数学考试 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 【剑指Offer】简单部分每日五题 - Day 1
今天开始更新leetcode上<剑指Offer>的题解,先从简单难度开始.预计按下列顺序更新: 简单难度:每日5题 中等难度:每日3题 困难难度:每日1题 17 - 打印从1到最大的n位数 ...
- 【JavaScript】Leetcode每日一题-平方数之和
[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...
- 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和
[JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...
- 【python】Leetcode每日一题-笨阶乘
[python]Leetcode每日一题-笨阶乘 [题目描述] 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 ...
- Java实习生常规技术面试题每日十题Java基础(八)
目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
随机推荐
- Istio 网格的出口定义者:深入了解 Egress Gateway
本文分享自华为云社区<Istio Egress 出口网关使用>,作者:k8s技术圈. 前面我们了解了位于服务网格内部的应用应如何访问网格外部的 HTTP 和 HTTPS 服务,知道如何通过 ...
- Codeforces Round 909 (Div3)(本菜鸟只补到了E)
Codeforces Round 909 (Div.3) A. Game with Integers 水题,就是可以被3整除的输出"Second",不能被3整除的输出"F ...
- serdes调试常见功能汇总
初始化流程 CORE复位流程 FW手动加载 FW版本自生成(可选) lane复位流程 TX复位流程 RX复位流程 TX,RX使能,disable(可选)关闭数据通道 速率频点配置,CPU模式配置,PL ...
- 解决Tensorflow2.0出现:AttributeError: module 'tensorflow' has no attribute 'get_default_graph'的问题
问题描述 在使用tensorflow2.0时,遇到了这个问题: AttributeError: module 'tensorflow' has no attribute 'get_default_gr ...
- SpringBoot-Validate优雅的实现参数校验,详细示例~
1.是什么? 它简化了 Java Bean Validation 的集成.Java Bean Validation 通过 JSR 380,也称为 Bean Validation 2.0,是一种标准化的 ...
- LeetCode:不用加号的加法(位运算)
解题思路:位运算,只能用位运算符.a.b同号比较好处理.主要是异号的情况,考虑 a>0,b<0,因为 a,b的绝对值都不会超过2^32,因此取模数为2^32.根据同余方程可知 (a+b)% ...
- 华企盾DSC登录控制台提示查询数据库错误
解决方法:服务器防火墙已经关了,查看控制台日志,如出现下图2问题升级到最新版即可解决,否则需要找研发处理
- NC65二开经验总结
公式相关 1.显示公式没执行 列表界面显示,卡片界面不显示: Handler的onBoCard执行: getBillCardPanel().execHeadLoadFormulas(); Contro ...
- 微信现金红包开发 PHP
第一次在cnblogs发文章 微信商家后台-现金红包开发 sdk <?php class wxPay { //配置参数信息 const SHANGHUHAO = "1430998xxx ...
- 动态规划问题(三)最长递增子序列长度(LIS)
问题描述 有一个数组,它内部的顺序是乱序的,现在要求你找出该数组中的最长的递增子序列长度. 例如:对于数组 {10, 20, 9, 33, 21, 50, 41, 60, 80},它的最长递增 ...