Codeforces Round #407 (Div. 2) C 数学 + DP
来源:互联网 发布:新浪云怎么绑定域名 编辑:程序博客网 时间:2024/05/21 20:26
题目链接
思路:
首先我们可以将每相邻两项的差的绝对值算出来,然后按顺序形成一个新的数列:
如样例
1 4 2 3 1 --> 3 2 1 2
记新数组为 a
观察公式,选取某一起点元素u,终点元素v,则:
f(l,r) = a[u] - a[u+1] + a[u+2] - a[u+3] ... a[v]
即正负号依此出现,呈交错性。
因为起点u和终点v可以任意选,则原问题转化为:
给你两个数组,求任意连续区间和的最大值
对于样例,即为:
求 a1: 3 -2 1 -2 和 a2: -3 2 -1 2 中任意连续区间和的最大值。
然后就变成了一个经典的问题。
朴素的枚举起点终点 或者 枚举区间长度 都是O(n^2) 此题果断超时没商量。
此时有两种写法进行选择:
一 .DP: 对于某一个元素 i,其作为终点时连续区间和的最大值dp[i]满足 :
二.处理前缀和 + 动态维护最小前缀和:
因为对于某一个元素 i,其作为终点时连续区间和的最大值dp[i]满足:
其中sum为前缀和,sum[j]为 i 之前最小的前缀和。
for(int i=1 ;i<=n ;i++){ // sum[0] = 0 sum[i] = sum[i-1] + a[i];}for(int i=1 ;i<=n ;i++){ ans = max(ans,sum[i] - Min); Min = min(Min,sum[i]);}
然后本蒟蒻选的第一种DP写法:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int A = 1e5 + 100;int a[A];ll v_1[A],v_2[A];ll dp_1[A],dp_2[A];int main(){ int n; scanf("%d",&n); for(int i=1 ;i<=n ;i++){ scanf("%d",&a[i]); } int now = 1; for(int i=1 ;i<n ;i++){ v_1[i] = now * abs(a[i+1] - a[i]); v_2[i] = -now * abs(a[i+1] - a[i]); now = -now; } ll ans = -1; dp_1[0] = dp_2[0] = 0; for(int i=1 ;i<n ;i++){ dp_1[i] = max((ll)0,dp_1[i-1]) + v_1[i]; dp_2[i] = max((ll)0,dp_2[i-1]) + v_2[i]; ans = max(ans,dp_1[i]); ans = max(ans,dp_2[i]); } printf("%I64d\n",ans); return 0;}
0 0
- Codeforces Round #407 (Div. 2) C 数学 + DP
- 【DP】Codeforces Round #336 (Div. 2) C
- Codeforces Round #363 (Div. 2) C dp
- Codeforces Round #303 (Div. 2) C dp
- Codeforces Round #286 (Div. 2) C dp
- Codeforces Round #369 (Div. 2) C dp
- DP-Codeforces Round #369 Div.2-C
- Codeforces Round #376(Div. 2) C dp
- Codeforces Round #198 (Div. 2) C. Tourist Problem (数学+dp)
- Codeforces Round #384 (Div. 2) B ,C ,D(规律,数学。树dp)
- Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] C 数学
- Codeforces Round #319 (Div. 2)B. Modulo Sum(数学,DP)
- Codeforces Round #295 (Div. 2) C. DNA Alignment(数学)
- Codeforces Round #298 (Div. 2) C. Polycarpus' Dice(数学)
- Codeforces Round #284 (Div. 2) C. Crazy Town 数学
- Codeforces Round #246 (Div. 2)(C)数学,思维
- Codeforces Round #257 (Div. 2) C. Jzzhu and Chocolate (数学)
- Codeforces Round #365 (Div. 2) C. Chris and Road 【数学】
- 渗透测试中的Application Verifier(DoubleAgent利用介绍)
- 基于深度学习的Person Re-ID(特征提取)
- 术
- 成为JavaGC专家(2)—如何监控Java垃圾回收机制
- 指针和数组
- Codeforces Round #407 (Div. 2) C 数学 + DP
- MySql数据库优化可以从哪几个方面进行?
- solr之solrconfig.xml
- 为什么不能从静态的方法里调用非静态的方法或变量
- 亲情购
- 十方馆
- 微信支付 不跳转
- java 操作调用js
- 成为Java GC专家(3)—如何优化Java垃圾回收机制