博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO Training3.3 A Game【区间Dp】 By cellur925
阅读量:5153 次
发布时间:2019-06-13

本文共 966 字,大约阅读时间需要 3 分钟。

一股浓浓的博弈论香气...然而本蒟并不会博弈论。

开始用双端队列+假的dp水过了24pts水数据。

其实是布星的,两人都绝顶聪明会深谋远虑不像我只看眼前,所以上述算法错误。

 

正解:区间dp。决策有两种:从右边取或是左边。而且答案是由小部分一步步推到大部分的,所以区间dp再适合不过啦。

状态:如常。$f[i][j]$表示拿从i到j玩家1得到的最大得分。

转移方程:$f[i][j]=max(sub[j]-sub[i-1]-f[i][j-1],sub[j]-sub[i-1]-f[i+1][j])$ sub[]是前缀和数组。

  第一个:当1拿了最右,则2拿i到j-1,剩下的归1;第二个同理。

目标:$f[1][n]$ (玩家1) $sub[n]-f[1][n]$(玩家2)

 

Code

1 #include
2 #include
3 4 using namespace std; 5 6 int n; 7 int a[500],sub[500]; 8 int f[500][500]; 9 10 int main()11 {12 scanf("%d",&n);13 for(int i=1;i<=n;i++)14 scanf("%d",&a[i]),sub[i]=sub[i-1]+a[i],f[i][i]=a[i];15 for(int i=n-1;i>=1;i--)16 for(int j=i+1;j<=n;j++)17 f[i][j]=max(sub[j]-sub[i-1]-f[i+1][j],sub[j]-sub[i-1]-f[i][j-1]);18 printf("%d %d",f[1][n],sub[n]-f[1][n]); 19 return 0;20 }
View Code

这么水都不会,我好菜呀。。。

Update:倒序循环的原因 $f[i][j]$需要从$f[i+1][j]$转移过来...

转载于:https://www.cnblogs.com/nopartyfoucaodong/p/9520442.html

你可能感兴趣的文章
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>
C语言初学 俩数相除问题
查看>>
B/S和C/S架构的区别
查看>>
[Java] Java record
查看>>
jQuery - 控制元素显示、隐藏、切换、滑动的方法
查看>>
postgresql学习文档
查看>>
Struts2返回JSON数据的具体应用范例
查看>>
js深度克隆对象、数组
查看>>
socket阻塞与非阻塞,同步与异步
查看>>
团队工作第二天
查看>>
System类
查看>>
tableView
查看>>
Happy Great BG-卡精度
查看>>
Xamarin Visual Studio不识别JDK路径
查看>>
菜鸟“抄程序”之道
查看>>
Ubuntu下关闭防火墙
查看>>
TCP/IP 邮件的原理
查看>>