zoj3381 Osaisen Choudai!
2024-06-11 23:05:34
题意:忽略题目背景,就是要收集最多的钱, 如果第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!相关推荐
- ZOJ 3381 Osaisen Choudai !
懒得朝硬盘的分类里放,存这了 RMQ: const int sup = 50010; int dp[sup], s[sup], x[sup], y[sup]; struct node { int mm ...
最新文章
- Windows10安装Linux子系统Ubuntu 20.04LTS,轻松使用生信软件,效率秒杀虚拟机
- MySQL系列:性能优化
- python控制鼠标,如何在Mac中使用Python控制鼠标?
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
- Spring 知识点详解
- JavaScript学习随记——错误类型
- 深度学习-计算机视觉--图像增广
- 收款神器!解读聚合收款码背后的原理,你都知道吗?
- linux maven编译代码,linux shell---- maven编译和部署 tomcat脚本
- pandas聚合dataframe某一列的值中的所有元素
- JAVA中如何判断一个输入是数字(小数和整数)还是字符串?
- 指针函数 (C语言)
- box-shadow属性详解
- 记忆测试系统c语言,单词记忆测试器程序设计.doc
- k3 wise组件服务器安装,金蝶 K3 WISE 中间层组件安装报错!
- three doors
- 输入身份证号自动算出年龄,出生日期,性别
- js实例之分解质因数
- 225页10万字政务大数据能力平台项目建议书
- 大数据时代下的计算机和互联网
热门文章
- 浮点数相加php,利用php怎么实现一个浮点数精确运算功能
- 捷易拍sdk开发指南.doc_每个Android开发都必须知道的利器
- 面试官:你说一下Redis使用场景都有哪些
- java 判断题_Java面试题及解析(判断题)
- Fluid 架构创新论文被国际数据库顶会 ICDE 录用
- python 字符串去重从小到大排列_110道题整理(1-60)
- xampp打开mysql的admin访问被拒绝_我被我的电脑磁盘拒绝了,为什么打不开,而显示“拒绝访问”呢...
- php 文件扫描去重,PHP中的去重方法详解和文件下载
- Oracle 移植 失败,Oracle迁移导致sqlplus报告ora-15180错误信息
- vmware虚拟机迁移到hyperv_ProxmoxVE 之 V2V迁移(vmware-PVE)