Luogu P1280 Niko的任务【线性dp】By cellur925
Nikonikoni~~
这是当时学长讲dp的第一道例题,我还上去献了个丑,然鹅学长讲的方法我似董非董(???
我当时说的怎么设计这道题的状态,但是好像说的是二维,本题数据范围均在10000级别,n²肯定会空间炸掉的(然而我当时还不懂...)
所以本题的状态肯定是一维的。
今天再做这道题,状态很容易出来了,设f[i]为1~i时间(到第i刻)的最大闲暇时间。然后日常不会推转移方程Orz。题解真香。
但,这个状态看似是正确的而且很可做的样子,但是我们仔细一想就会发现在这个状态下转移的漏洞:
如果当前时刻有很多可以开始的任务,但他们的结束时间可能各不相同,那么所能获得的闲暇时间就各有优劣了。正推看来是有弊病的。
那么我们就选择逆推:
设f[i]表示i~n所能获得的最大闲暇时间。我们还需要统计当前时刻有没有任务开始了。
如果当前时刻没有任务,就继承i+1时刻的闲暇状态;f[i]=f[i+1]+1;
如果当前时刻有任务,就扫一遍当前时刻开始的全部任务,看从他们中谁的结束时间转移而来所收获的闲暇最多;即 f[i]=max{f[i+task[++pos].endd]}。pos是我们记录当前到第几个任务的量,由于逆推,我们初始需要把任务按开始时间从大到小进行排序。
Code
#include<cstdio>
#include<algorithm> using namespace std; int n,m,pos;
int f[],sum[];
struct node{
int beginn,endd;
}task[]; bool cmp(node a,node b)
{
return a.beginn>b.beginn;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&task[i].beginn,&task[i].endd),sum[task[i].beginn]++;
sort(task+,task++m,cmp);
for(int i=n;i>=;i--)
{
if(!sum[i]) f[i]=f[i+]+;
else
for(int j=;j<=sum[i];j++)
f[i]=max(f[i],f[i+task[++pos].endd]);
}
printf("%d",f[]);
return ;
}
Luogu P1280 Niko的任务【线性dp】By cellur925的更多相关文章
- 洛谷 P1280 尼克的任务 (线性DP)
题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...
- P1280 尼克的任务 线性DP
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- Luogu P1541 乌龟棋 【线性dp】
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行 N 个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟 ...
- Luogu P1280 尼可的任务(dp)
题意: 时间为n,有k个任务,每个任务有一个开始时间和持续时间,从第一分钟开始,如果有开始的任务就要做,问最大空闲时间 n,k<=1e5 思路: 设 dp[i]为i~n时间中最大空闲时间,vec ...
- 线性dp
线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- 线性DP总结(studying
写在前面 虽然都说线性DP是入门,但我还是今天才开始学 线性DP就是珂以通过线性处理得出答案的一种DP 每一种状态都可以从前面推得,并且推导过程是呈线性的 参考题单(本人现在主要用luogu,所以这些 ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
随机推荐
- 动态规划: HDU 1789Doing Homework again
Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...
- 初学总结--------Java修饰符与修饰关键字(且叫修饰关键字)
Java中有类,有成员变量,有成员方法,有局部变量.他们分别能用什么来修饰? 目前学习到的类,有普通类和内部类. 一.修饰普通类: 1.public 每个文件中只有一个类能被public修饰,表示可 ...
- ultraiso:usb-hdd+ v2
http://cn.ezbsystems.com/ultraiso/download.htm 普通隐藏:建立一个LBA前置的PBR包含表头的活动分区.高端隐藏:建立一个LBA后置的PBR包含表头的活动 ...
- 关于MySQL的boolean和tinyint(1)
原文:http://blog.csdn.net/woshixuye/article/details/7089508 MySQL保存boolean值时用1代表TRUE,0代表FALSE.boolean在 ...
- 如何扩展ArcGIS中的元数据编辑器
http://www.esrichina-bj.cn/old../library/arcnews16/Metadata.htm http://www.esrichina-bj.cn/old../lib ...
- ubuntu 16.04上安装php5.6
php --ini 按下面的步骤,在ubuntu 16.04上面安装成功了 php5.6 dpkg -l | grep php| awk '{print $2}' |tr "\n" ...
- long类型字段转换成varchar2类型
參考文档: How to Convert a Long to Varchar2 (文档 ID 228532.1) /*long类型字段转换成varchar2类型*/ --建表 create table ...
- IntelliJ IDEA 使用maven 集成SpringMVC+Hibernate
准备工作: 安装idea intellij 安装jdk1.8,配好环境变量 安装tomcat 7 准备工作完成之后,就开始创建项目了 创建项目 1.File–>new project–>选 ...
- 通过SQL SERVER加入系统管理员帐号
通过SQL SERVER加入系统管理员帐号.当然是须要有足够的权限,远程链接数据库后执行脚本,脚本例如以下: /* 此代码是在master数据库下执行 添加系统管理员:mmcgzs password: ...
- linux下weblogic11g成功安装后,启动报错Getting boot identity from user
<2015-7-1 下午05时46分33秒 CST> <Info> <Management> <BEA-141107> <Version: Web ...