题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数。

显然这种类型的博弈题,第一眼就是极大极小搜索+记忆化,但是我并不是很会极大极小搜索TAT。然后第二眼发现可以用DP写,而且显然比极大极小搜索好写啊。这一类的题有一个最普遍的做法,预处理出前缀和,然后f[i][j]表示从第i个数到第j个数先手可得到的最大得分,则有$$f[i][j]=sum[j]-sum[i-1]-min(f[i+1][j],f[i][j-1]);$$【第i个数到第j个数的和减去min(第i+1个数到第j个数先手可得到的最大得分,第i个数到第j-1个数先手可得到的最大得分)】

要注意一点,由于$$f[i][j]$$需要用到$$f[i+1][j]和f[i][j-1]$$,所以我们需要枚举的是i到j这个区间的长度,先把区间长度小的计算出来,才能计算区间长度大的,一开始就被这个坑了,果然我还是太弱了= =。。。

代码如下:

var
n,i,j,x:longint;
f:array[..,..]of longint;
sum:array[..]of longint; function min(a,b:longint):longint;
begin
if a<b then exit(a);
exit(b);
end; begin
readln(n);
for i:= to n do
begin
read(x);
sum[i]:=sum[i-]+x;//前缀和
f[i][i]:=x;
end;
for j:= to n- do//枚举区间长度
for i:= to n-j do//枚举起点
f[i][i+j]:=sum[i+j]-sum[i-]-min(f[i+][i+j],f[i][i+j-]);
writeln(f[][n],' ',sum[n]-f[][n]);//后手为sum[n]-f[][n]
end.

其实还可以省一维。

代码如下:

var
n,i,j,x:longint;
f:array[..]of longint;
sum:array[..]of longint; function min(a,b:longint):longint;
begin
if a<b then exit(a);
exit(b);
end; begin
readln(n);
for i:= to n do
begin
read(x);
sum[i]:=sum[i-]+x;
f[i]:=x;
end;
for i:= to n- do
for j:= to n-i do
f[j]:=sum[j+i]-sum[j-]-min(f[j],f[j+]);
writeln(f[],' ',sum[n]-f[]);
end.

当然,我不会极大极小搜索是因为我是蒟蒻啊。。。这道题HR神犇用的就是极大极小搜索,真是太神了%%%。

dfs(l,r)表示已在左边取了l个数,已在右边取了r个数,在剩下的数里取,最多比对手多多少分,则有$$dfs(l,r):=max(a[l+1]-dfs(l+1,r),a[n-r]-dfs(l,r+1));$$由于双方都用最优策略,所以最多比对手多多少分=max(取左边的数-对手接下来最多比你多多少分,取右边的数-对手接下来最多比你多多少分);则先手分数为(总分+先手最多比后手多多少分)div 2,而后手得分则为(总分-先手最多比后手多多少分)div 2。

代码如下:

var n,i,j,res,sum:longint;
a:array[..] of longint;
f:array[..,..] of longint;
function max(a.b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
function dfs(l,r:longint):longint;
begin
if f[l,r]<>maxlongint then exit(f[l,r]);
if l+r=n then begin
f[l,r]:=;
exit();
end;
f[l,r]:=max(a[l+]-dfs(l+,r),a[n-r]-dfs(l,r+));
exit(f[l,r]);
end;
begin
readln(n);
sum:=;
for i:= to n do begin
read(a[i]);
inc(sum,a[i]);
end;
for i:= to n do
for j:= to n-i do
f[i,j]:=maxlongint;
res:=dfs(,);
writeln((sum+f[,]) div ,' ',(sum-f[,]) div );
end.

[CodeVs3196]黄金宝藏(DP/极大极小搜索)的更多相关文章

  1. codevs3196 黄金宝藏

    题目描述 Description 小毛终于到达宝藏点,他意外地发现有一个外星人(名叫Pluto).宝藏是一些太空黄金,有n堆排成一行,每堆中有xi颗黄金.小毛和Pluto决定轮流从中取出黄金,规则是每 ...

  2. 算法笔记--极大极小搜索及alpha-beta剪枝

    参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...

  3. 【codevs】3196 黄金宝藏

    [算法]区间DP+博弈论 [题解]其实它都不是博弈题…… 很自然的可以设f[i][j]表示i~j先手可取得的最大价值. 容易得到转移式:f[i][j]=max(a[i]+sum[i+1~j]-f[i+ ...

  4. poj 1568 Find the Winning Move 极大极小搜索

    思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...

  5. 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】

    极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...

  6. POJ 1568 极大极小搜索 + alpha-beta剪枝

    极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的. 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了..瞬间吐血! ps. 据说加一句 if sum & ...

  7. [BZOJ5248][九省联考2018]一双木棋(连通性DP,对抗搜索)

    5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 43  Solved: 34[Submit][Status ...

  8. poj 3317 Stake Your Claim 极大极小搜索

    思路:为了方便,当c1>c2时将0变为1,1变为0. 空格最多有10个,每个空格有3个状态,如果不状态压缩,会TLE的.所以最多有3^10种情况 代码如下: #include<iostre ...

  9. hdu2993坡dp+二进制搜索

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

随机推荐

  1. 求两个字符串的最长公共子串——Java实现

    要求:求两个字符串的最长公共子串,如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”(子串必须是连续的) public class Main03{ // 求解两个字符号的最长 ...

  2. katalon系列九:DEBUG调试功能

    Katalon Studio做为一个IDE,具有和其他IDE一样的Debug功能,可以让我们方便的调试代码.将脚本切换到Script模式,在你想设断点的行首双击,或右击选择:(Groovy)Toggl ...

  3. and_or_not 逻辑运算符的操作注解!

    python操作:

  4. vue关于img src动态赋值问题

    解决方法: 加个require()就可以了 <img :src="require('../assets/images/'+imgsrc+'.png')"/>

  5. docker应用容器化准则—12 factor

    在云的时代,越来越多的传统应用需要迁移到云环境下,新应用也要求能适应云的架构设计和开发模式.而12-factor提供了一套标准的云原生应用开发的最佳原则. 在容器云项目中应用容器化主要参考12-Fac ...

  6. 『ACM C++』PTA浙大 | 基础题 - Have Fun with Numbers

    连着这两道都是开学前数构老师的“爱心作业”,还没上课开学就给我们布置作业了,这道题有点小坑,也经常遇到类似的问题,特地拿出来记录一下. -------------------------------- ...

  7. presto 配置mysql.properties异常Database (catalog) must not be specified in JDBC URL for MySQL connector

    在presto 0.210 以后配置mysql.properties的时候,对于jdbc-url属性配置后面要加上对应要链接的database connection-url=jdbc:mysql:// ...

  8. redis利用key计时与计数

    计时 Setex 命令为指定的 key 设置值及其过期时间.如果 key 已经存在, SETEX 命令将会替换旧的值 基本命令: redis 127.0.0.1:6379> SETEX KEY_ ...

  9. hadoop HA sshfen切换隔离时无法跳转ssh: bash: fuser: 未找到命令

    在zkfc的日志里面,有一个warn:PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8090 via ssh: bash: fuser: 未找到命令原因是 ...

  10. [C++] Solve "Launch Failed. Binary not found." error on Eclipse

    This error is that the default lanch configuration is not being created for this project. To solve i ...