题目链接:http://codeforces.com/problemset/problem/1038/D

题意:

给出 $n$ 个史莱姆,每个史莱姆有一个价值 $a[i]$,一个史莱姆可以吃掉相邻的史莱姆,此时其自身的价值就要减掉被吃掉的那个史莱姆的价值。

史莱姆会不断的互相吞噬直到最后只剩一个,要求你该史莱姆可能的最大价值。

题解:

相当于你在 $n$ 个数前面添加 $+$ 或者 $-$,然后拼成一个算式计算答案。

首先考虑到的是,史莱姆的价值是全正或者全负的情况,这样的话,不可能使得所有价值前都添上 $+$ 或者都添上 $-$,这个特判处理一下就好。

其次,就是有正有负的情况:

  首先,若仅有一个史莱姆身怀正价值,所以在它前面添上 $+$,其余所有史莱姆前面都添上 $-$,此时价值最大化;显然这是可行的,只要“正史莱姆”不停地吃掉相邻的所有“负史莱姆”即可。

  其次,若此时有两个“正史莱姆”,其余全是“负史莱姆”,那么通过一系列吞噬必然能够变成如下两种情况之一:

    “负史莱姆,正史莱姆,正史莱姆”:这种情况,要让两个正史莱姆的价值前面都是 $+$ 号,负史莱姆前面是个 $-$ 号,只需要让 $1$ 吃掉 $2$,再让 $3$ 吃掉 $1$ 即可。

    “正史莱姆,负史莱姆,正史莱姆”:这种情况,只需要让 $2$ 吃掉 $3$,再让 $1$ 吃掉 $2$ 即可。

  这样一来,两个正史莱姆的情况就能转化到一个正史莱姆的情况,以此类推,不难发现,三个正史莱姆可以转化到两个正史莱姆,……,$n$ 个正史莱姆可以转化到 $n-1$ 个正史莱姆。

所以,对于有正有负的情况,可以在所有正史莱姆前添 $+$ 号,所有负史莱姆前添 $-$ 号,即把所有史莱姆的价值的绝对值相加。因为不管怎么样,总有一个对应的吃法可以做到这样。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n;
ll a[maxn];
int main()
{
ios::sync_with_stdio();
cin.tie(), cout.tie(); cin>>n;
ll mx=-INF, mn=INF, sum=;
for(int i=;i<=n;i++)
cin>>a[i], sum+=abs(a[i]), mx=max(mx,a[i]), mn=min(mn,a[i]); if(n==) {cout<<a[]<<endl;return ;} if(mx<) //全负
cout<<sum+*mx<<endl;
else if(mn>) //全正
cout<<sum-*mn<<endl;
else
cout<<sum<<endl;
}

题解2:

当然,我们也可以不特判全正全负的情况,因为我们现在已经知道了,只要你确保既添加了 $+$ 号也添加了 $-$ 号,不管添加的正负号序列是怎么样的,都是通过某种吞吃方法来做到的。

所以我们可以用 $dp[i][x=0,1][y=0,1]$ 来表示,前 $i$ 个的最大值,$x$ 记录是否已经添加过 $+$ 号,$y$ 记录是否已经添加过 $-$ 号。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n;
ll a[maxn],dp[maxn][][];
int main()
{
ios::sync_with_stdio();
cin.tie(), cout.tie(); cin>>n;
for(int i=;i<=n;i++) cin>>a[i]; if(n==) {cout<<a[]<<endl;return ;} dp[][][]=a[], dp[][][]=-a[];
dp[][][]=dp[][][]=-INF;
for(int i=;i<=n;i++)
{
dp[i][][]=dp[i-][][]+a[i];
dp[i][][]=dp[i-][][]-a[i]; dp[i][][]=-INF;
dp[i][][]=max(dp[i][][],dp[i-][][]+a[i]);
dp[i][][]=max(dp[i][][],dp[i-][][]-a[i]);
dp[i][][]=max(dp[i][][],dp[i-][][]+abs(a[i]));
} cout<<dp[n][][]<<endl;
}

Codeforces 1038D - Slime - [思维题][DP]的更多相关文章

  1. [SHOI2007] 书柜的尺寸 思维题+Dp+空间优化

    Online Judge:Luogu-P2160 Label:思维题,Dp,空间优化 题面: 题目描述 给\(N\)本书,每本书有高度\(Hi\),厚度\(Ti\).要摆在一个三层的书架上. 书架的宽 ...

  2. CodeForces - 1102A(思维题)

    https://vjudge.net/problem/2135388/origin Describe You are given an integer sequence 1,2,-,n. You ha ...

  3. CodeForces - 631C ——(思维题)

    Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...

  4. CodeForces - 468A ——(思维题)

    Little X used to play a card game called "24 Game", but recently he has found it too easy. ...

  5. CodeForces - 669D——(思维题)

    Little Artem is fond of dancing. Most of all dances Artem likes rueda — Cuban dance that is danced b ...

  6. CodeForces - 589D —(思维题)

    Welcoming autumn evening is the best for walking along the boulevard and npeople decided to do so. T ...

  7. Sonya and Robots CodeForces - 1004C (思维题)

    Sonya and Robots time limit per test 1 second memory limit per test 256 megabytes input: standard in ...

  8. CodeForces - 603A-Alternative Thinking (思维题)

    Kevin has just recevied his disappointing results on the USA Identification of Cows Olympiad (USAICO ...

  9. Neko Performs Cat Furrier Transform CodeForces - 1152B 二进制思维题

    Neko Performs Cat Furrier TransformCodeForces - 1152B 题目大意:给你一个x,在40步操作以内把x变成2m−1,m为非负整数.对于每步操作,奇数步可 ...

随机推荐

  1. 安装Logtail(Linux系统)

    Logtail客户端是日志服务提供的日志采集客户端,请参考本文档,在Linux服务器上安装Logtail客户端. 支持的系统 支持如下版本的Linux x86-64(64位)服务器: Aliyun L ...

  2. 单片机成长之路(51基础篇) - 017 C51中data,idata,xdata,pdata的区别(转)

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  3. 基于Centos搭建Laravel 环境搭建

    系统要求:CentOS 7.2 64 位操作系统 安装 Laravel Laravel 简介 Laravel 是一套简洁.优雅的 PHP Web 开发框架.它可以让你从面条一样杂乱的代码中解脱出来:它 ...

  4. selenium是如何启动浏览器的

    前几天有同学问到selenium是怎么样启动浏览器的(selenium启动浏览器的原理),当时稍微讲解了一下,不过自我感觉不够具体,现在特地把启动原理通过代码和一系列操作给串联起来,希望可以帮助大家更 ...

  5. slf4j-api、slf4j-log4j12、log4j之间关系

    1. slf4j-api slf4j:Simple Logging Facade for Java,为java提供的简单日志Facade.Facade门面,更底层一点说就是接口.它允许用户以自己的喜好 ...

  6. iOS的动态代理模式的实现

    动态代理模式的应用很多,特别是在不能修改被代理类的前提下,要对执行某些方法时需要打log或者捕捉异常等处理时,是一个非常方便的方法.只需要少量修改客户端(场景类)代码和添加一个代理类就可以实现,这个符 ...

  7. [k8s]jenkins配合kubernetes插件实现k8s集群构建的持续集成

    另一个结合harbor自动构建镜像的思路: 即code+baseimage一体的方案 - 程序员将代码提交到代码仓库gitlab - 钩子触发jenkins master启动一次构建 - jenkin ...

  8. 物联网架构成长之路(17)-SpringCloud目前遇到的注意事项

    1. STS插件最好是要安装的. 2. 对应的Decompiler插件也是要安装的. 3. 如果遇到maven工程因为找不到包问题的, 在确认pom.xml 文件没有问题的情况下, 右键项目-Mave ...

  9. python工具 - 读取文件的部分指定内容并输出到外置窗口

    一.使用场景 某些配置文件里有一些特定的字符,而这些字符恰巧需要我们采集出来,然后输出到另外一个窗口做展示时,可以使用该工具. 本例的演示则提取配置文件中的[姓名:黄蓉 女 九阴真经.姓名:郭靖 男 ...

  10. 在GitHub中下载的项目,如何运行

    1.查看说明文档README-CN.md 2.大概流程 1.安装依赖 cnpm install 2.启动服务 npm run dev