题目链接: [CodeForces 332B]Maximum Absurdity[DP]

题意分析:

寻找两个不重叠的长度为k的子串,使得它们之和最大。

解题思路:

第一想法是,处理出从这个点开始,长度为k的区间的总和,即getv[i]代表区间[i, i + k - 1]的和,然后想着这个能怎么用?

然后发现可以处理出来之后,从getv[1]开始枚举,dp[i]代表从i开始,和最大的区间和。

然后每次更新getv[i] + dp[i + k]即可。

个人感受:

灵光一闪啊喂= =

具体代码如下:

#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<string>
#define ll long long
#define pr(x) cout << #x << " = " << (x) << '\n';
using namespace std;const int INF = 0x7f7f7f7f;
const int MAXN = 2e5 + 111;ll a[MAXN], getv[MAXN];
struct P {ll val, pos; // 记录位置和和
}dp[MAXN];int main()
{int n, k;while (cin >> n >> k) {for (int i = 1; i <= n; ++i) cin >> a[i];ll sum = 0;for (int i = 1; i <= k; ++i) sum += a[i];getv[1] = sum;for (int i = k + 1; i <= n; ++i) {sum += a[i] - a[i - k];getv[i - k + 1] = sum;}dp[n - k + 1].val = getv[n - k + 1];dp[n - k + 1].pos = n - k + 1;for (int i = n - k; i > k; --i) {if (getv[i] >= dp[i + 1].val) {dp[i].val = getv[i];dp[i].pos = i;}else {dp[i].val = dp[i + 1].val;dp[i].pos = dp[i + 1].pos;}}int a = 0, b = 0;ll mx = 0;for (int i = k + 1; i <= n - k + 1; ++i) {ll sum = getv[i - k] + dp[i].val;if (sum > mx) {mx = sum;a = i - k;b = dp[i].pos;}}cout << a << ' ' << b << '\n';}return 0;
}

[CodeForces 332B]Maximum Absurdity[DP]相关推荐

  1. codeforces 332b Maximum Absurdity dp

    题意: 有n个数,找两个段(每个段长度为k)不相交,求出这两个段的和的最大值. 输出两个段的起始下标. 思路: dp[i][j]:走到i,已经选了j个段的最大值. 转移:dp[i][j] = dp[i ...

  2. 【CodeForces 332B --- Maximum Absurdity】递推

    [CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...

  3. Codeforces 332B Maximum Absurdity(DP+前缀和处理)

    题目链接:http://codeforces.com/problemset/problem/332/B 题目大意: 给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两 ...

  4. CodeForces 332B Maximum Absurdity

    http://codeforces.com/problemset/problem/332/B 给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠.只要对 ...

  5. Codeforces 332B Maximum Absurdity(暴力)

    题意: 给你一个序列,让你在里面选择两个不想交的长度为k的字段,是的和最大. 我第一次做还是用的dp,感觉复杂度有点高啊,后来发现直接预处理就好了. 预处理需要三个数组,分别是sum[i],Max[i ...

  6. CodeForces - 332B  Maximum Absurdity   前缀和

    这道题主要用的前缀和的思想,看了网上大佬的代码感觉很巧妙.我之前有好几个点没注意,WA了好几次,还有就是要用long long类型.不多说了,直接贴AC代码: #include<cstdio&g ...

  7. CodeForces 332B Maximum Absurdity(线段树单点更新)

    题意: 给你一个序列,找两个长度为 k 且没有重合区间的数使得其和最大 解析: 线段树,就是把起点为 i 长度为 k 的和预处理出来,再枚举a,与a线段不重合的,后面的部分用线段树来找最大位置,总复杂 ...

  8. codeforces B.Maximum Absurdity 解题报告

    题目链接:http://codeforces.com/contest/332/problem/B 题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a ...

  9. codeforce 332B Maximum Absurdity

    原题链接 题意 一个长为N的序列,选择其中2个长为K的不相交区间,使两个区间和最大 题解 CF标签上写的好好的DP,做着做着发现就是前缀和思想嘛,哪里有DP?哪里有DP? #include<bi ...

最新文章

  1. yield( )函数的使用
  2. git 在拉取代码的时候connect 谷歌报错_工具 | 手把手教你在VSCode中使用Git
  3. POJ 3686 The Windy's
  4. java异常处理试题答案_Java 面试题和答案 - (下)
  5. java 如何开启一个线程_Java-开启一个新的线程
  6. 马上就校招了,是要去实习还是复习?
  7. 面试官 | JVM 为什么使用元空间替换了永久代?
  8. 栈-----括号匹配+表达式计算
  9. python 列表为空_如果列表为空,则Python返回False
  10. 延迟初始化Spring Bean的几种方式
  11. python 库总结_最近用的python 库总结
  12. OCRKit Pro for mac (OCR文字识别工具)
  13. oracle 审计变换表空间_Oracle审计日志和审计策略数据表迁移到新表空间
  14. (原创)十大危险cmd命令代码总结
  15. 曲奇云盘资源搜索引擎_曲奇云盘下载-曲奇云盘资源共享群组下载_快啦网
  16. 持久化配置管理 diamond 使用简介
  17. 计算机内存不足黑屏怎么办,win10内存不足会黑屏怎么办
  18. 帆软数据分析:BI物流可视化
  19. krpano教程之字幕添加,配合语音解说滚动字幕
  20. 《罗马革命》豆瓣 9.1 从恺撒大帝到屋大维

热门文章

  1. openwrt 显示系统运行时间和空闲时间
  2. Oracle 计算两个时间的差值
  3. 浅谈网络世界中的Power Law现象(一) 什么是Power Law
  4. 主成分分析;主成分回归分析——Hald水泥问题;主成分分析案例——各地区普通高等教育发展水平综合评价;matlab
  5. 罗克韦尔自动化收购工业自动化系统模拟与仿真的领先软件开发商Emulate3D
  6. 数据预处理归一化Z-score归一化Min-Max归一化程序
  7. Java通过javacsv实现读取csv文件数据
  8. python matplotlib 画图保存图片简单例子
  9. 3GPP TS 23501-g51 中英文对照 | 4.4.2 SMS over NAS
  10. Mac下安装sqlmap