codeforces 789 C. Functions again(dp求区间和最大)
题目链接:http://codeforces.com/contest/789/problem/C
题意:就是给出一个公式
然后给出一串数求一个区间使得f(l,r)最大。
这题需要一个小小的处理
可以设数组b[i]和c[i]
if i % 2 == 0
b[i]=abs(a[i]-a[i+1])
c[i]=-abs(a[i]-a[i+1])
else
b[i]=-abs(a[i]-a[i+1])
c[i]=abs(a[i]-a[i+1])
然后就是求两个数组的区间和的最大值这个方法就不介绍了
至于为什么要分b,c两个数组,很简单,因为f都是一正一负的所以取的首位是什么那么接下来的正负就定了
但是这个数列不论怎么去就只有两种取法就是这两种。
#include <iostream>
#include <cstring>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
const int M = 1e5 + 10;
int a[M] , b[M] , c[M];
ll dp[M][3][3];
int Abs(int x) {
if(x < 0)
return -x;
return x;
}
int main() {
int n;
scanf("%d" , &n);
for(int i = 1 ; i <= n ; i++) {
scanf("%d" , &a[i]);
}
ll MAX1 = 0 , MAX2 = 0 , sum1 = 0 , sum2 = 0;
for(int i = 1 ; i < n ; i++) {
if(i % 2 == 0) {
b[i] = Abs(a[i] - a[i + 1]);
c[i] = -1 * Abs(a[i] - a[i + 1]);
}
else {
b[i] = -1 * Abs(a[i] - a[i + 1]);
c[i] = Abs(a[i] - a[i + 1]);
}
}
for(int i = 1 ; i < n ; i++) {
if(sum1 < 0) {
sum1 = (ll)b[i];
}
else {
sum1 += (ll)b[i];
}
MAX1 = max(MAX1 , sum1);
}
for(int i = 1 ; i < n ; i++) {
if(sum2 < 0) {
sum2 = (ll)c[i];
}
else {
sum2 += (ll)c[i];
}
MAX2 = max(MAX2 , sum2);
}
printf("%I64d\n" , max(MAX1 , MAX2));
return 0;
}
codeforces 789 C. Functions again(dp求区间和最大)的更多相关文章
- HDU 3709 Balanced Number 求区间内的满足是否平衡的数量 (数位dp)
平衡数的定义是指,以某位作为支点,此位的左面(数字 * 距离)之和 与右边相等,距离是指某位到支点的距离; 题意:求区间内满足平衡数的数量 : 分析:很好这又是常见的数位dp , 不过不同的是我们这次 ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- Codeforces 467C. George and Job (dp)
题目链接:http://codeforces.com/contest/467/problem/C 求k个不重叠长m的连续子序列的最大和. dp[i][j]表示第i个数的位置个序列的最大和. 前缀和一下 ...
- hdu3183 rmq求区间最值的下标
两个月前做的题,以后可以看看,是rmq关于求区间最值的下标 /* hdu3183 终点 给一个整数,可以删除m位,留下的数字形成一个新的整数 rmq 取n-m个数,使形成的数最小 */ #includ ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- POJ - 3264 Balanced Lineup (RMQ问题求区间最值)
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- LightOj 1197 - Help Hanzo(分段筛选法 求区间素数个数)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 题意:给你两个数 a b,求区间 [a, b]内素数的个数, a and b ( ...
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- Svn提交冲突问题
MEclipse中的svn冲突解决办法: 1. 点击提交,报错——‘SVN提交’has encountered a problem. 2. 选中无法提交的文件,点击更新操作 ...
- 表单与v-model
基本用法 vue.js提供了v-model指令,用于在表单类元素上双向绑定数据,例如在输入框上使用,输入的内容会实时映射到绑定的数据上 example1:修改input框内容,message会实时渲染 ...
- JavaSE(一)Java程序的三个基本规则-组织形式,编译运行,命名规则
一.Java程序的组织形式 Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位. J ...
- Meta 用法汇总
本文引自: http://blog.csdn.net/MR_LP/article/details/53607087 什么是 meta ? meta 是html语言head区的一个辅助性标签.也许你认为 ...
- mvnjar包冲突解决方法
命令 mvn dependency:tree -Dverbose 结果: [INFO] +- com.esotericsoftware:kryo:jar:4.0.2:test [INFO] | +- ...
- 《深入理解Java虚拟机》-Java代码是如何运行的
问题一:Java与C++区别 1.Java需要运行时环境,包括Java虚拟机以及Java核心类库等. 2.C++无需额外的运行时,通常编译后的代码可以让机器直接读取,即机器码 问题一:Java为什么要 ...
- python --- 零碎
1.匿名输出: lambda x : print(x))(100) #冒号前输入量 ,冒号后是输出量结果:100 2.导入调用其他python文件: test1.py #第一个python文件 def ...
- CSS实现三栏布局(5种)
常见的布局方式: float布局.Position定位.table布局.弹性(flex)布局.网格(grid)布局 那么我们就是用以上5种方式完成三栏布局,不过前提是左右宽度(假如左右宽度为300px ...
- MacOS VSCode 安装 GO 插件失败问题解决
0x00 问题重现 Installing golang.org/x/tools/cmd/guru FAILED Installing golang.org/x/tools/cmd/gorename F ...
- python小白手册之字符串的私有方法和公用方法
#字符串方法. name=input('1111') if name.isalnum(): print(是否由数字字母) isdigit isdecimal判断数字 strip去空格或者其他 name ...