https://www.luogu.org/problemnew/show/CF859C

Description

有一个长度为\(n\)的序列,Alice和Bob在玩游戏。Bob先手掌握决策权。

他们从左向右扫整个序列,在任意时刻,拥有决策权的人有如下两个选择:

将当前的数加到自己的得分中,并将决策权给对方,对方将获得下一个数的决策权

将当前的数加到对方的得分中,并将决策权保留给自己,自己将获得下一个数的决策权

假定他们都使用最优策略,求他们最后分别能获得多少分

Input

第一行是一个整数\(n\)代表序列长度

第二行有\(n\)个用空格隔开的整数,代表这个序列

Output

输出一行两个用空格隔开的整数,代表Alice和Bob的最终得分

Hint

\(Forall:\)

\(0~\leq~n~\leq~50\)。

若设序列为\(a\),则\(1~\leq~a_i~\leq~100000\)

Solution

傻逼数据范围给了50……看着题目想折半搜索想了半天,搜了下题解发现是\(O(n)\)的DP……那你给我50的范围是要干嘛啊emmmm

考虑正着dp,设\(f_i\)为前\(i\)个数的ans,于是发现并不能转移,因为填表转移时是对手和你一起决策,一个取max一个取min显然没法做。填表法并不能记录这个状态是先手的还是后手的,记录先后手也不能做。

于是考虑倒着做,设\(f_i\)为从\(i\)开始选一直选到\(n\),发现这样的决策是自己一个人做最优决策,转移到下一维的最大值即可。方程显然:

\[f_i~=~\max(f_{i+1}~,sum_{i}-f_{i+1})
\]

其中\(sum\)代表后缀和

Code

#include <cstdio>
#include <algorithm>
#ifdef ONLINE_JUDGE
#define freopen(a, b, c)
#endif
#define rg register
#define ci const int
#define cl const long long typedef long long int ll; namespace IPT {
const int L = 1000000;
char buf[L], *front=buf, *end=buf;
char GetChar() {
if(front == end) {
end = buf + fread(front = buf, 1, L, stdin);
if(front == end) return -1;
}
return *(front++);
}
} template <typename T>
inline void qr(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while((ch > '9') || (ch < '0')) lst = ch, ch=IPT::GetChar();
while((ch >= '0') && (ch <= '9')) x = (x << 1) + (x << 3) + (ch ^ 48), ch = IPT::GetChar();
if(lst == '-') x = -x;
} template <typename T>
inline void ReadDb(T &x) {
rg char ch = IPT::GetChar(), lst = ' ';
while((ch > '9') || (ch < '0')) lst = ch, ch = IPT::GetChar();
while((ch >= '0') && (ch <= '9')) x = x * 10 + (ch ^ 48), ch = IPT::GetChar();
if(ch == '.') {
ch = IPT::GetChar();
double base = 1;
while((ch >= '0') && (ch <= '9')) x += (ch ^ 48) * ((base *= 0.1)), ch = IPT::GetChar();
}
if(lst == '-') x = -x;
} namespace OPT {
char buf[120];
} template <typename T>
inline void qw(T x, const char aft, const bool pt) {
if(x < 0) {x = -x, putchar('-');}
rg int top=0;
do {OPT::buf[++top] = x % 10 + '0';} while( x /= 10);
while(top) putchar(OPT::buf[top--]);
if(pt) putchar(aft);
} const int maxn = 55; int n;
int MU[maxn], sum[maxn], frog[maxn]; int main() {
freopen("1.in","r",stdin);
qr(n);
for(rg int i = 1; i <= n; ++i) qr(MU[i]);
for(rg int i = n; i; --i) sum[i] = sum[i+1] + MU[i];
for(rg int i = n; i; --i) frog[i] = std::max(frog[i+1], sum[i] - frog[i+1]);
qw(sum[1] - frog[1], ' ', true);qw(frog[1], '\n', true);
return 0;
}

Summary

正着不能DP时,考虑反着做

【DP】CF859C Pie Rules的更多相关文章

  1. HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】

    HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  2. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  3. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  4. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  5. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  6. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  7. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  8. HackerRank - common-child【DP】

    HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...

  9. LeetCode:零钱兑换【322】【DP】

    LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...

随机推荐

  1. oracle的分号和斜杠/

    ;是执行语句必须的/是执行语句块必须的 比如执行一个触发器 CREATE OR REPLACE TRIGGER "TRG_1" BEFORE INSERT ON "CAT ...

  2. List<T>.Distinct()

    )            }; //使用匿名方法            List<Person> delegateList = personList.Distinct(new Compar ...

  3. 第三次ScrumMeeting博客

    第三次ScrumMeeting博客 本次会议于10月27日(五)22时整在3公寓725房间召开,持续10分钟. 与会人员:刘畅.方科栋.窦鑫泽.张安澜. 1. 每个人的工作(有Issue的内容和链接) ...

  4. TCP的三次握手(建立连接)和四次挥手(关闭连接)(转)

    转自:(http://www.cnblogs.com/Jessy/p/3535612.html) 参照: http://course.ccniit.com/CSTD/Linux/reference/f ...

  5. loadrunner socket协议问题归纳(3)

    摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发 ...

  6. Java访问控制

    转自:菜鸟教程

  7. 冲刺阶段站立会议每日任务i4

    昨天对小组成员的任务进行了进一步细化分配,今天了解了安卓开发环境的相关知识. 遇到的问题: 没有遇到问题.

  8. 对其中的一个特点将NABC的分析结果

    一.题目要求 每一个组员针对其中的一个特点将NABC的分析结果发表博客上(截止日期4月8日晚24:00前). 二.分析结果 特点之一:通讯方便 <渴了么>这个安卓APP特点之一就是通讯方便 ...

  9. iOS- 如何建立索引实现本地文本搜索引擎,允许容错搜索?

    1.前言 实现一个本地搜索引擎,允许容错搜索,也就是搜索结果不需要和搜索的关键字完全精准匹配.比如,搜索”eric wang“,搜索结果可以包括Erica Watts等等.搜索效率十分高. 这里我们需 ...

  10. 4th 课堂SCRM会议旁观记录

    项目名称:基于C#的连连看设计 小组名称:待定 小组成员:张政.张金生.武志远.李权 Master:张政 项目已完成部分: 现阶段已经实现了一定的功能,可以运行使用,进行第一关的游戏. 今天计划要完成 ...