题意:忽略题目背景,就是要收集最多的钱, 如果第i天拿到了si 的钱, 那么第i+x[i] 天 到 第i + y[i] - 1 天必须再拿一次,否则就再也拿不到钱了,当然,第i +x[i]天之前也是拿不到的, 题目要求第一天必须拿。。

分析:一开始想到了用记忆化搜索,代码很短, 一下就敲完了, 结果也果断超时了

后来想到了按记忆化搜索的思路,直接从最后一天开始算起,用dp[i] 表示第i天拿到了钱之后,到第n天为止,最多拿到的钱数,

那么dp[i] = s[i] + max(dp[j])    (i + x[i] <= j <= i + y[i] - 1)

到这一步就很明显了,这里涉及到了区间最值的问题,我们可以用线段树来维护

zoj3381

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>using namespace std;const int N = 50000 + 10;int dp[N];
int s[N], x[N], y[N];
int n;struct node
{int l, r, maxx;
}p[N * 3];void build(int s, int t, int k)
{p[k].l = s, p[k].r = t;p[k].maxx = 0;if( s == t )return ;int kl = k << 1, kr = kl + 1, mid = (s + t) >> 1;build(s, mid, kl);build(mid + 1, t, kr);
}void update(int k, int s, int val)
{if(s == p[k].l && p[k].r == p[k].l){p[k].maxx = val;return ;}int kl = k << 1, kr = kl + 1, mid = (p[k].l + p[k].r) >> 1;if( s <= mid ) update(kl, s, val);else update(kr, s, val);p[k].maxx = max(p[kl].maxx, p[kr].maxx);
}int query(int s, int t, int k)
{if( s <= p[k].l && t >= p[k].r){return p[k].maxx;}int mid = (p[k].l + p[k].r) >> 1;int kl = k << 1, kr = kl + 1;int a = 0, b = 0;if(s <= mid) a = query(s, t, kl);if(t > mid) b = query(s, t, kr);return max(a, b);
}int main()
{while(scanf("%d",&n) == 1){for(int i = 1; i <= n; ++i)scanf("%d %d %d",&s[i], &x[i], &y[i]);build(1, n, 1);update(1, n, s[n]);int ans = 0;for(int i = n - 1; i >= 1; --i){int l = i + x[i];int r = i + y[i] - 1;r = min(r, n);int val = s[i] + query(l, r, 1);update(1, i, val);if(i == 1) ans = val;}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/nanke/archive/2013/04/06/3002496.html

zoj3381 Osaisen Choudai!相关推荐

  1. ZOJ 3381 Osaisen Choudai !

    懒得朝硬盘的分类里放,存这了 RMQ: const int sup = 50010; int dp[sup], s[sup], x[sup], y[sup]; struct node { int mm ...

最新文章

  1. Windows10安装Linux子系统Ubuntu 20.04LTS,轻松使用生信软件,效率秒杀虚拟机
  2. MySQL系列:性能优化
  3. python控制鼠标,如何在Mac中使用Python控制鼠标?
  4. 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
  5. Spring 知识点详解
  6. JavaScript学习随记——错误类型
  7. 深度学习-计算机视觉--图像增广
  8. 收款神器!解读聚合收款码背后的原理,你都知道吗?
  9. linux maven编译代码,linux shell---- maven编译和部署 tomcat脚本
  10. pandas聚合dataframe某一列的值中的所有元素
  11. JAVA中如何判断一个输入是数字(小数和整数)还是字符串?
  12. 指针函数 (C语言)
  13. box-shadow属性详解
  14. 记忆测试系统c语言,单词记忆测试器程序设计.doc
  15. k3 wise组件服务器安装,金蝶 K3 WISE 中间层组件安装报错!
  16. three doors
  17. 输入身份证号自动算出年龄,出生日期,性别
  18. js实例之分解质因数
  19. 225页10万字政务大数据能力平台项目建议书
  20. 大数据时代下的计算机和互联网

热门文章

  1. 浮点数相加php,利用php怎么实现一个浮点数精确运算功能
  2. 捷易拍sdk开发指南.doc_每个Android开发都必须知道的利器
  3. 面试官:你说一下Redis使用场景都有哪些
  4. java 判断题_Java面试题及解析(判断题)
  5. Fluid 架构创新论文被国际数据库顶会 ICDE 录用
  6. python 字符串去重从小到大排列_110道题整理(1-60)
  7. xampp打开mysql的admin访问被拒绝_我被我的电脑磁盘拒绝了,为什么打不开,而显示“拒绝访问”呢...
  8. php 文件扫描去重,PHP中的去重方法详解和文件下载
  9. Oracle 移植 失败,Oracle迁移导致sqlplus报告ora-15180错误信息
  10. vmware虚拟机迁移到hyperv_ProxmoxVE 之 V2V迁移(vmware-PVE)