【codeforces 484D】【DP】Kindergarten
来源:互联网 发布:gradle java 版本 编辑:程序博客网 时间:2024/06/06 03:41
传送门:http://codeforces.com/contest/484/problem/D
题意:
给定一个包含n个元素的数组,我们可以把位置连续的数分为一组,每组至少包含一个元素。
每组对答案的贡献是这个组内最大的数和最小的数的差值。
对于单个元素组成的组,差值为0。输出答案的最大值
思路:定义i是峰值点,如果a[i-1]<=a[i]>=a[i+1]或者a[i-1]>=a[i]<=a[i+1],那么每一段中包含的峰值点一定在这一段的端点,否则从峰值点处将区间断开不会使结果变差,这也说明了存在最优解使得每一段是严格单调的,记dp[i]为把前i个数分段的最大得分,考虑i左侧最近的峰值点la,那么只需枚举la属于前一段还是后一段,于是有dp[i]=max(dp[la-1]+labs(a[i]-a[la]),dp[la]+labs(a[i]-a[la+1])),复杂度O(n)
代码:
#include <bits/stdc++.h>using namespace std;#define ll __int64const int inf=0x3f3f3f3f;const int N=1e6+10;ll a[N], dp[N];int main(){ int n; scanf("%d", &n); for(int i=1; i<=n; i++)scanf("%I64d", &a[i]); int la=1; for(int i=2; i<=n; i++){ dp[i]=max(dp[la-1]+labs(a[i]-a[la]), dp[la]+labs(a[i]-a[la+1])); if(i<n){ if(a[i-1]<=a[i] && a[i]>=a[i+1])la=i; if(a[i-1]>=a[i] && a[i]<=a[i+1])la=i; } } printf("%I64d\n", dp[n]); return 0;}描述:
0 0
- Kindergarten - CodeForces 484 D dp
- Codeforces 484D Kindergarten(dp)
- 【codeforces 484D】【DP】Kindergarten
- [Codeforces 484D Kindergarten] DP
- Codeforces 484D. Kindergarten DP贪心
- CodeForces 484 D.Kindergarten(dp)
- codeforces 484D kindergarten
- CodeForces 484D Kindergarten
- CodeForces - 484D Kindergarten
- Codeforces 484D-kindergarten
- CodeForces 484D Kindergarten
- 484D - Kindergarten DP
- [Codeforces 484D] Kindergarten (DP + 树状数组优化)
- codeforces 484D Kindergarten 【动态规划】
- Codeforces Round #276 (Div. 1) D. Kindergarten dp
- Codeforces Round #276 (Div. 1) D. Kindergarten
- 【DP】CodeForces 148D
- Codeforces 221D(dp)
- 微信小程序-合法域名校验出错
- Android Handler 实例化-->发送消息-->处理消息流程
- C#修改本地系统时间转载
- MyBatis(1):MyBatis入门
- 结构体的指针偏移
- 【codeforces 484D】【DP】Kindergarten
- OC部分
- Java 性能优化的五大技巧
- C++ 一道基础笔试题
- 原型模式
- CSS练习一之内部样式表、外部样式表、边框
- Python Unicode 与中文处理
- 性能优化那些事
- dom4j解析xml