Gym 100829S_surf 动态规划的优化
题目大意是,非你若干个任务,任务分别对应开始时间、预期收益、持续时间三项指标,让你从中选择一个受益最大的方案(没有开始时间相同的任务)。
于是,标准状态转移方程应当为,设DP[K]为选择了前K个任务的最大收益,后面转移为DP[K+1]=MAX且能够共存的(DP[I]);很容易想到N^2的暴力更新,但是这题数量太大,会炸得连渣都不剩。于是需要优化到较低的数量级(比如NLOGN)
注意到,我们也许不用对某个任务来选取前K个的最大值,不容易想到优化但是想想刘汝佳同志的话——不方便直接求解的时候想想更新状态看看,于是就变成了状态更新公式而不是状态转移方程。——对于求得的DP[K]更新所有合法 的,大于K的DP值。注意到,当前序列已经经过了排序,所以,当找到第一个合法的DP[P]P>K时候,就会有P+1也是合法的状态,因此很容易想到树状数组相对最大值+二分查找确定位置(只要有比较函数就可以写二分)。最后复杂度是NLOGN。
另外根据某些奇怪的树上的书法,,任何一个动态规划的优化算法都应当从如下三个状态进行考虑:
1、状态总数 N N
2、决策数 N 1
3、状态转移时间复杂度 1 LOGN
分别对应原始DP和优化后的DP
AC代码如下:考虑到没有校园网所以在VJ上面交的。。。于是投篮用了万能头文件,好孩子不要学我哟~
#include<bits/stdc++.h>
using namespace std; const long long MAXN=; class Mession
{
public:
long long a,b,p;
};Mession messions[MAXN];
long long tree[MAXN];
long long dp[MAXN];
long long n;
void insert(int pos,long long key)
{
while(pos<=n)
{
tree[pos]=max(key,tree[pos]);
pos+=pos&(-pos);
}
}
long long getSum(int pos)
{
long long ans=;
while(pos)
{
ans=max(tree[pos],ans);
pos-=pos&(-pos);
}return ans;
}
bool cmp(Mession m1,Mession m2)
{
return m1.a<m2.a;
}
void init()
{
cin>>n;
for(int i=;i<=n;++i)
{
cin>>messions[i].a>>messions[i].p>>messions[i].b;
messions[i].b+=messions[i].a;
}sort(messions+,messions+n+,cmp);
long long ans=;
for(int i=;i<=n;++i)
{
dp[i]=messions[i].p;
dp[i]+=getSum(i);
Mession mm;mm.a=messions[i].b;
int pos=lower_bound(messions+,messions++n,mm,cmp)-messions;
insert(pos,dp[i]);
ans=max(dp[i],ans);
}
cout<<ans<<endl;
} int main()
{
cin.sync_with_stdio(false);
init();
return ;
}
Gym 100829S_surf 动态规划的优化的更多相关文章
- 【学习笔记】动态规划—斜率优化DP(超详细)
[学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...
- 剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化
剑指 Offer 60. n个骰子的点数 Offer_60 题目详情 题解分析 package com.walegarrett.offer; /** * @Author WaleGarrett * @ ...
- [bzoj1911][Apio2010特别行动队] (动态规划+斜率优化)
Description Input Output Sample Input - - Sample Output HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[ ...
- [bzoj1597][usaco2008 mar]土地购买 (动态规划+斜率优化)
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
- [luogu3648][bzoj3675][APIO2014]序列分割【动态规划+斜率优化】
题目大意 让你把一个数列分成k+1个部分,使分成乘积分成各个段乘积和最大. 分析 首先肯定是无法开下n \(\times\) n的数组,那么来一个小技巧:因为我们知道k的状态肯定是从k-1的状态转移过 ...
- 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割
Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...
- 动态规划(斜率优化):BZOJ 1010 【HNOI2008】 玩具装箱
玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8218 Solved: 3233[Submit] Description P 教授要去 ...
- BZOJ 1096: [ZJOI2007]仓库建设(动态规划+斜率优化)
第一次写斜率优化,发现其实也没啥难的,没打过就随便找了一份代码借(chao)鉴(xi)下,不要介意= = 题解实在是懒得写了,贴代码吧= = CODE: #include<cstdio># ...
- UOJ#104. 【APIO2014】Split the sequence 动态规划 斜率优化
原文链接www.cnblogs.com/zhouzhendong/p/UOJ104.html 题解 首先证明一个结论:对于一种分割方案,分割的顺序不影响最终结果. 证明:对于树 a[x] 和 a[y] ...
随机推荐
- <ganglia+nagios>rhel6.5
由于linux下的office和win下有所区别,我只能把linux下的.dot文件打包成pdf,粘贴发送标出来,但有些图片还是没办法发表,要是有朋友感兴趣的话,可加我qq 215687833具体的文 ...
- 完美解决Android在listview添加checkbox实现单选多选操作问题
在Android某些开发需求当中,有时候需要在listveiw中加入checkbox实现单选,多选操作.表面上看上去只是改变checkbox那么简单,然而实际开发中,实现起来并不是那么得心应手.尤其当 ...
- pandas:数据分析
一.介绍 pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. 1.主要功能 具备对其功能的数据结构DataFrame.Series 集成时间序列功能 提供丰富的数学运算和操 ...
- Android接入支付宝支付实现
接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...
- Retrofit 2.0:有史以来最大的改进
因为其简单与出色的性能,Retrofit 是安卓上最流行的HTTP Client库之一. 不过它的缺点是在Retrofit 1.x中没有直接取消正在进行中任务的方法.如果你想做这件事必须手动杀死,而这 ...
- Angular ui-route介绍
参考博客: https://www.cnblogs.com/haogj/p/4885928.html 原文地址:http://www.ng-newsletter.com/posts/angular-u ...
- Apache Solr-6.0.1 (OpenLogic CentOS 7.2)
Apache Solr-6.0.1 (OpenLogic CentOS 7.2) 平台: CentOS 类型: 虚拟机镜像 软件包: java1.8 solr6.0.1 application ser ...
- LeetCode Valid Parentheses 有效括号
class Solution { public: void push(char c){ //插入结点 struct node *n=new struct node; n->nex=; n-> ...
- UVA Stacks of Flapjacks 栈排序
题意:给一个整数序列,输出每次反转的位置,输出0代表排序完成.给一个序列1 2 3 4 5,这5就是栈底,1是顶,底到顶的位置是从1~5,每次反转是指从左数第i个位置,将其及其左边所有的数字都反转,假 ...
- 因技术垃圾直接上手groovy的工作感悟
因为熟悉devops,用IDEA的git完成版本提交,不太喜欢公司的代码控制,从事groovy基本没有代码控制,提交就打个压缩包给指定的人. 没有持续继承,持续部署(CICD). http://xio ...