POJ_1678

如果我们把差在[a,b]的范围内的两个数之间连一条边的话,就会发现实际上取数的过程就是在有向无环图上行走的过程,对于一个点来讲,如果选择了它,并把选择它的人看作先手的话,那么之后的选择形成的先手与后手的分差唯一的,于是我们就可以把选择每个节点看作一个状态并进行记忆化搜索。

于是可以用f[i]表示如果当前选第i个数,并把选择这个数的人看作先手,从这个选择开始后续形成的分差的最大值。同时,在dp的过程中我们要认为后手选择的是最优的情况,所以有f[i]=a[i]-max{f[j]},其中a[i]表示第i个数的值,j为i的后继。

#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 0x3f3f3f3f#define MAXD 10010int N, A, B, a[MAXD], f[MAXD];int cmp(const void *_p, const void *_q){int *p = (int *)_p, *q = (int *)_q;return *p - *q;}void init(){int i, j, k;    scanf("%d%d%d", &N, &A, &B);for(i = 0; i < N; i ++)        scanf("%d", &a[i]);    qsort(a, N, sizeof(a[0]), cmp);}int dfs(int cur){if(f[cur] != -1)return f[cur];int i, j, k, ans = -INF;for(i = cur + 1; i < N && a[i] - a[cur] <= B; i ++)if(a[i] - a[cur] >= A && (k = dfs(i)) > ans)            ans = k;if(ans == -INF)        ans = 0;return f[cur] = a[cur] - ans;}void solve(){int i, j, k, ans = -INF;    memset(f, -1, sizeof(f[0]) * N);for(i = 0; i < N; i ++)if(a[i] >= A && a[i] <= B && (k = dfs(i)) > ans)            ans = k;    printf("%d\n", ans == -INF ? 0 : ans);}int main(){int t;    scanf("%d", &t);while(t --)    {        init();        solve();    }return 0;}

POJ 1678 I Love this Game!相关推荐

  1. (精)【ACM刷题之路】POJ题目详细多角度分类及推荐题目

    POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: ...

  2. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  3. poj题目详细分类及算法推荐题目

    DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题  ...

  4. ACM POJ 题目分类(完整整理版本)

    DP: 1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题   ...

  5. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

  6. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

    水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法:        (1)枚举 (1753,2965)       (2)贪心(13 ...

  7. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  8. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  9. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

最新文章

  1. 一种安全的static变量Get/Set方式
  2. .htaccess:正则表达式、重定向代码
  3. linux下kill多个进程
  4. 各种编码范围总结以及linux下面的编码批量转化
  5. CTF web题 wp:
  6. 简 易 版 的 进 程 池 模 型 学 习
  7. C++工作笔记-对结构体的进一步认识
  8. 69. (待补) (使用sqlite3)实现简单的管理系统 MVC 将链表作为内存数据模型,将sqlite3作为数据库,将终端作为交互界面。读数据库生成 链表,修改链表写入文件。...
  9. static数据的初始化
  10. 05《基于深度卷积神经网络的车型识别研究》学习总结
  11. 红蓝对抗之win10 权限提升
  12. 学英语《每日一歌》之Traveling Light
  13. GC算法很通俗的讲解hot
  14. 西南大学计算机考研资料汇总
  15. 无线打印机服务器怎样设置密码,配置网络打印机服务器设置密码
  16. 黑苹果NVIDIA显卡驱动程序【 WebDriver-378.10.10.10.20.108+支持macOS 10.13.1 High Sierra (17B1002)版本】
  17. 织梦网站转移服务器,DEDE织梦网站转移空间换域名方法
  18. jQuery学习第二天——jQuery的常见效果(上)
  19. 采油高级工实际计算机,采油工高级实际管柱图.ppt
  20. python面试 --基础题

热门文章

  1. 教机器遗忘或许比学习更重要:让AI健忘的三种方式
  2. 《Nature》重磅 | 研究员利用机器学习发现近 6000 种未知病毒
  3. CTO梁军离职,市值蒸发59亿,核心技术人才仅剩3人!寒武纪“动荡”的6周年
  4. 当 AI 开始“入侵”人类
  5. DBA大牛告诉你,如何让MySQL语句执行加速?
  6. 程序员,不要急于学习编程语言,先学会如何解决问题
  7. (20/24) webpack实战技巧:watch实现热打包和添加代码备注
  8. 【转载】Java异常控制机制和异常处理原则
  9. 深度探索Hyperledger技术与应用之超级账本初体验(附部署代码)
  10. linux 中mmap的用法