CF 789C DP,最大子段和

本文提供Codeforces 789C题目的解题思路及C++代码实现。通过计算相邻元素差值的绝对值并利用动态规划寻找最大子段和,解决了选择连续元素使差值平方和最大的问题。

题目链接:http://codeforces.com/contest/789/problem/C
题意:
这里写图片描述

解法:我们会发现我们选的子段要么第一个数是正的,要么第一个数是负,所以我们只需要copy一下原来的数组做两次最大字段和,开始还在思考two pointers,稍微想一些好sb的题啊,队友昨天上紫了,然而太晚没打,真是可惜。。。现在是真的两个cf div1带我这个cf一直fst,蓝号都回不去的弱鸡了。

//CF 789C

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
template <class T1, class T2> inline void gmax(T1 &x, T2 y) {x = max(x, y);}
int a[maxn], b[maxn], c[maxn], d[maxn];
long long ans;
int main()
{
    int n;
    scanf("%d", &n);
    long long ans = 0;
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i < n; i++){
        b[i] = abs(a[i] - a[i+1]);
        gmax(ans, 1LL*b[i]);
    }
    for(int i = 1; i < n; i++){
        if(i%2 == 1) c[i] = -b[i];
        else c[i] = b[i];
    }
    for(int i = 1; i < n; i++){
        if(i%2 == 1) d[i] = b[i];
        else d[i] = -b[i];
    }
    long long cur = 0;
    for(int i = 1; i < n; i++){
        cur += 1LL*c[i];
        if(cur > ans){
            ans = cur;
        }
        if(cur < 0){
            cur = 0;
        }
    }
    cur = 0;
    for(int i = 1; i < n; i++){
        cur += 1LL*d[i];
        if(cur > ans){
            ans = cur;
        }
        if(cur < 0){
            cur = 0;
        }
    }
    cout << ans << endl;
    return 0;
}
c++14 ## 题目描述 在某个悠闲的下午,Furai 面前摆着 $n$ 块精致的小点心,排成一列。第 $i$ 块点心的“甜蜜值”为 $a_i$(可能是负数,意味着不太好吃)。 Furai 可以任选一些点心来组合(也可以一个都不选)。把选中的点心下标按从小到大排序后,显然会形成若干连续的区间组合。 例如:选中点心的下标 $2,3,4,7,8$,会形成两区间组合:$[2,4]$ $[7,8]$;选中点心的下标 $5,6,7$,就是一区间组合 $[5,7]$;如果一个都不选,则没有区间组合。 对于每一个区间组合 $[L,R]$ 中,Furai 会重新按顺序给每个点心一个编号,也就是 $1,2,...,R-L+1$,她只打算认真品尝编号为奇数的点心(获得对应的“甜蜜值”),而编号为偶数的点心只是为了让组合看起来更丰富,实际上她并不吃它们(因此不计“甜蜜值”)。 每次开始品尝一个新的组合,Furai 都需要花费 $C$ 的“甜蜜值”来调整心情。 这次下午茶时光的总“甜蜜值”是所有区间组合的“甜蜜值”之。 虽然 Furai 肯定吃不完这么多点心,但是她还是希望知道能得到的最大“甜蜜值”。 请注意,Furai 选择的任意两个区间不能相连 ## 输入格式 第一行两个正整数 $n,C\ (1\le n\le3\times10^5,1\le C\le10^9)$,表示点心数量每次开始品尝新组合的花费。 第二行 $n$ 个整数,第 $i$ 个整数为 $a_i\ (-10^9\le a_i\le10^9)$,表示第 $i$ 个点心的“甜蜜值”。 ## 输出格式 输出一个整数,表示 Furai 能得到的最大总“甜蜜值”。 ## 输入输出样例 #1 ### 输入 #1 ``` 4 2 7 4 5 11 ``` ### 输出 #1 ``` 14 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 5 3 3 -4 -2 0 4 ``` ### 输出 #2 ``` 2 ``` ## 说明/提示 对于第一组样例,Furai 需要选择 $a_1,a_4$,也就是区间组合 $[1,1],[4,4]$ 来获得最大总“甜蜜值”:$7-2+11-2=14$。 对于第二组样例,她需要选择 $a_1,a_2,a_3,a_4,a_5$,也就是区间组合 $[1,5]$,这次她不得不吃掉一个不太好吃的点心 $a_3$,才能获得最大总“甜蜜值”:$3+(-2)+4-3=2$。可以证明没有更大的总“甜蜜值”。
最新发布
12-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值