题解:CF859C Pie Rules

Luogu - CF859C

Analysis

由题意知每个人选择时都是以最佳情况来选,最佳情况是指他的选择能使后面拿的更多。所以决定最佳情况是来自后面。

还有一个重要性质,不管是 Bob 还是 Alice,只要是拥有决策权的人面对同一个局面,其得到的最大得分一定相等。这样,我们找到了固定状态,就可以 dp 了。

因为我们管的是从某个位置往后面取的最大值,所以可以找某一个位置 i i i 到 n n n 的值。

设 f ( i , n ) f(i,n) f(i,n) 表示 i ∼ n i \sim n i∼n 区间里,选到 i i i 时,先手取的最大值。 a a a 数组存储原序列, s u m i , j sum_{i,j} sumi,j 表示 a i ∼ a j a_i \sim a_j ai∼aj 的和。

分两种情况:

  1. 他要拿的当前的数。相当于增加收益,但把选择权给了对方。转移到 s u m i + 1 , n − f ( i + 1 , n ) + a i sum_{i+1,n}-f(i+1,n)+a_i sumi+1,n−f(i+1,n)+ai。

    意思是 i + 1 , n i+1,n i+1,n 区间的和,减去后面的人可以取到的最大值,再加上当前可以拿的 a i a_i ai。

  2. 他选当前的数,选后面的。相当于放弃了收益,但保留选择权。转移到 f ( i + 1 , n ) f(i+1,n) f(i+1,n)。

发现 f f f 函数第二个参数都是 n n n,可以省略。

于是,设 f i fi fi 表示先手面对 i ∼ n i \sim n i∼n 时,可以取到的最大值。

我们只需将两种情况的最大值,赋值给 f i f_i fi 即可:
f i = max ⁡ { f i + 1 , s u m i + 1 , n − f i + 1 + a i } f_i=\max\{f_{i+1},\ sum_{i+1,n}-f_{i+1}+a_i\} fi=max{fi+1, sumi+1,n−fi+1+ai}

我们知道第一个选的是 Bob,所以 Bob 得到的就是 f 1 f_1 f1,Alice 得到的就是 Bob 剩下的,即 s u m 1 , n − f 1 sum_{1,n}-f_1 sum1,n−f1。

Code

考虑倒序 dp。注意 a i a_i ai 的范围是 1 0 6 10^6 106,不开 long long 必然会炸。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve()
{
    int n;
    cin >> n;
    vector <int> a(n + 1); // 原始数组
    vector <ll> s(n + 1); // 前缀和数组,a[i]<=1e6,开long long!
    vector <ll> f(n + 2); // dp数组,long long
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
        s[i] = s[i - 1] + a[i];
    }
    for(int i = n; i >= 1; i --){ // 倒推
        f[i] = max(f[i + 1], (s[n] - s[i]/*i+1~n区间和*/) - f[i + 1] + a[i]);
    }
    cout << s[n] - f[1] << ' ' << f[1] << endl;
}

signed main()
{
    ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);
    solve();
    return 0;
}

End

这里是 YLCHUP,谢谢大家!

相关推荐
feng_you_ying_li5 分钟前
C++复习二,继承与多态
c++
AOwhisky12 分钟前
MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
运维·数据库·笔记·学习·mysql·云计算
小小de风呀13 分钟前
de风——【从零开始学C++】(十一):list的基本使用和模拟实现
开发语言·c++·list
KaMeidebaby22 分钟前
卡梅德生物技术快报|原核表达系统工艺优化:包涵体重折叠 + 分子筛纯化实现功能 RBD 高效制备,附全参数配置
前端·人工智能·算法·数据挖掘·数据分析
三行数学31 分钟前
Matlab之父克利夫·莫勒尔逝世
开发语言·matlab
陌路2033 分钟前
C++高级进阶--夯实进阶基础(1)
开发语言·c++
无限码力38 分钟前
携程0510笔试真题【单数组交换】
算法·携程笔试·携程笔试真题·携程0510笔试真题
梦想三三1 小时前
【PYthon词频统计与文本向量化】苏宁易购评论分析实战
开发语言·python
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
try2find1 小时前
Agent学习之补充my_plan_solve_agent
学习