codeforces 332b Maximum Absurdity dp
题意:
有n个数,找两个段(每个段长度为k)不相交,求出这两个段的和的最大值。
输出两个段的起始下标。
思路:
dp[i][j]:走到i,已经选了j个段的最大值。
转移:dp[i][j] = dp[i-k][j-1] + sum[i]-sum[i-k];
输出方案的话,根据dp的值dfs回去(不dfs也是可以的),因为方案已经记录在dp的转移中。
code:
#include <cmath>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;typedef long long LL;
const int MAXN = 2*1e5+5;
const int INF = 0x3f3f3f3f;int n, k;
int r1 = INF, r2 = INF;
LL dp[MAXN][3], sum[MAXN];
void dfs(int idx, int ti) {if(ti == 0 || idx < k) return ;if(dp[idx][ti] == dp[idx-1][ti])dfs(idx-1, ti);else if(dp[idx][ti] == dp[idx-k][ti-1] + sum[idx]-sum[idx-k]) {dfs(idx-k, ti-1);if(ti == 2) r2 = min(r2, idx-k+1);else r1 = min(r1, idx-k+1);}
}int main() {scanf("%d%d", &n, &k);int tmp;for(int i = 1;i <= n; i++) {scanf("%d", &tmp);sum[i] = sum[i-1]+tmp;}//memset(dp, 0, sizeof(dp));for(int i = k;i <= n; i++) {for(int j = 1;j <= 2; j++) {dp[i][j] = max(dp[i][j], dp[i-1][j]);if(j == 1 || dp[i-k][j-1] != 0)dp[i][j] = max(dp[i][j], dp[i-k][j-1]+sum[i]-sum[i-k]);}}//pathdfs(n, 2);printf("%d %d\n", r1, r2);return 0;
}
codeforces 332b Maximum Absurdity dp相关推荐
- [CodeForces 332B]Maximum Absurdity[DP]
题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...
- 【CodeForces 332B --- Maximum Absurdity】递推
[CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...
- Codeforces 332B Maximum Absurdity(DP+前缀和处理)
题目链接:http://codeforces.com/problemset/problem/332/B 题目大意: 给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两 ...
- CodeForces 332B Maximum Absurdity
http://codeforces.com/problemset/problem/332/B 给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠.只要对 ...
- Codeforces 332B Maximum Absurdity(暴力)
题意: 给你一个序列,让你在里面选择两个不想交的长度为k的字段,是的和最大. 我第一次做还是用的dp,感觉复杂度有点高啊,后来发现直接预处理就好了. 预处理需要三个数组,分别是sum[i],Max[i ...
- CodeForces - 332B Maximum Absurdity 前缀和
这道题主要用的前缀和的思想,看了网上大佬的代码感觉很巧妙.我之前有好几个点没注意,WA了好几次,还有就是要用long long类型.不多说了,直接贴AC代码: #include<cstdio&g ...
- CodeForces 332B Maximum Absurdity(线段树单点更新)
题意: 给你一个序列,找两个长度为 k 且没有重合区间的数使得其和最大 解析: 线段树,就是把起点为 i 长度为 k 的和预处理出来,再枚举a,与a线段不重合的,后面的部分用线段树来找最大位置,总复杂 ...
- codeforces B.Maximum Absurdity 解题报告
题目链接:http://codeforces.com/contest/332/problem/B 题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a ...
- codeforce 332B Maximum Absurdity
原题链接 题意 一个长为N的序列,选择其中2个长为K的不相交区间,使两个区间和最大 题解 CF标签上写的好好的DP,做着做着发现就是前缀和思想嘛,哪里有DP?哪里有DP? #include<bi ...
最新文章
- linux rsync 带密码,Linux配置ssh无密码验证,rsync
- linux wifi 配置 编程,linux 无线手动配置
- 保温杯哪种材质最好_哪种保温杯质量好?
- 当append遇到make遇到的坑
- R语言神经网络与深度学习(一)
- Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
- c语言中next和prior连在一起,C语言中双向链表和双向循环链表详解
- Winform 中 dataGridView 导出到Excel中的方法总结
- 中国车机行业竞争态势与未来发展策略分析报告2022-2028年
- 在Android上实现汉字笔顺动画效果
- 2022年美容师(初级)操作证考试题库及模拟考试
- Packet Tracer 和 Wirshark 抓取数据包
- AAAI2021知识图谱论文集
- 二维码如何制作?简单的制作方法介绍
- Mysql中使用关键字name做字段名
- png格式的icon使用方法
- win10 werfault.exe 内存不能read 修复
- 力扣算法学习(十二)
- Android Studio连接安卓手机驱动
- mysql - user/privileges/用户与权限/用户权限/管理用户权限