博弈题,使用DP来完成。开始时,我以为可以用极大极小加剪枝可以过,但,TLE。。。

看过一些题解,没看懂,但也由此有了启发:

我们只记录差(初始为0),那为1选的数即为在原差值上加上该数,2选即是减去该数。那么,可以有以下的式子来表达这一过程

ANS=A-B+C-D+E-F;

神奇的事情来了,将式子转换一下ANS=A-(B-(C-(D-(E-F))));把TMP=(B-(C-(D-(E-F))));

很明显,我们得到了一个递归的式子。怎么理解呢?这样想,1选了A之后,即到B选。那么,2肯定希望选择后的TMP(也表示一个差值)最大,使得总的差值最小。那么2选后,1却希望总的差值最大,那么,它也只需使得它选之后的C-(D-(E-F)最大(慢慢分析,你会发现是对的)。这里,很显然有一个无后效性。于是,可以采用记忆化搜索来完成。

妙。。。

 #include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int inf=(<<);
int num[],dp[];
int n,A,B; int work(int m){
if(dp[m]!=-inf)
return dp[m];
int ans=-inf;
for(int i=m+;i<n;i++){
int tmp=num[i]-num[m];
if(tmp>B) break;
if(tmp>=A&&tmp<=B){
ans=max(ans,work(i));
}
}
if(ans==-inf){
dp[m]=num[m];
}
else {
dp[m]=num[m]-ans;
}
return dp[m];
} void slove(){
int ans=-inf;
for(int i=;i<n;i++){
if(num[i]>=A&&num[i]<=B){
ans=max(ans,work(i));
}
}
if(ans==-inf)
printf("0\n");
else printf("%d\n",ans);
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&A,&B);
for(int i=;i<n;i++){
dp[i]=-inf;
scanf("%d",&num[i]);
}
sort(num,num+n);
slove();
}
return ;
}

最新文章

  1. GridView的高度自适应
  2. 在navgationController中添加UISegmentedControl
  3. MongoDB 中遇到的一些错误
  4. 大数据平台搭建(hadoop+spark)
  5. [置顶] 自娱自乐6之Linux gadget驱动5(自编gadget驱动,包涵与之通讯的主机usb驱动,已调试通过)
  6. 关于new enhancement的一些知识
  7. C# 跨线程呼叫控制
  8. Virtualbox之Ubuntu虚拟机网络访问设置
  9. TPS、并发用户数、吞吐量关系
  10. 面试题:电梯/雨伞/杯子/笔/A4纸/纸杯… 怎么测试?
  11. linux 压缩当前文件夹下所有文件
  12. C# Tuple&lt;T1,T2....T&gt;元组的使用
  13. 在Laravel中使用mongoDB
  14. 对WebSocket技术的学习与探索(二)
  15. 西南交通大学结构服役安全及力学基础创新团队在Wiley出版英文专著(转载)
  16. linux yum 下载至本地及使用本地缓存安装包
  17. Asp.Net MVC 3.0 使用Gzip压缩
  18. 实践:由0到1-无线大数据UX团队的成长
  19. centos 下Qt安装 mysql驱动(亲测可行)
  20. Problem B: 年龄问题

热门文章

  1. 对ip数据进行分类----c++
  2. [Apple开发者帐户帮助]五、管理标识符(1)注册应用程序ID
  3. JavaScript 判断手机端操作系统(Andorid/IOS)
  4. Java导入excel并保存到数据库
  5. ArcGIS API For Android Errors汇总
  6. dubbo之隐式参数
  7. Reducing the Dimensionality of Data with Neural Networks:神经网络用于降维
  8. python 生成测试报告并发送邮件
  9. 使用Java生成具有安全哈希的QR码
  10. C语言中时钟编程