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 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
随机推荐
- FATE---hdu2159(二重背包)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Reverse Nodes in k-Group (链表)
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- ZOJ 1232 【灵活运用FLOYD】 【图DP】
题意: copy自http://blog.csdn.net/monkey_little/article/details/6637805 有A个村子和B个城堡,村子标号是1~A,城堡标号是A+1~B.马 ...
- Spring Boot+Profile实现不同环境读取不同配置
文件结构如下: 但是官方推荐放在config文件夹下. 作用: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中.prod环境下的配 ...
- hdu 3624 City Planning(暴力,也可扫描线)
City Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- Linux Grub系统加密、破密、修复
一.在重新启动系统时候按任意键进入 grub界面 Grub加密 一.title前的密码 修改grub.conf 这种加密只是在用户要进入grub界面的时候提示要输入密码,但是可以正常进入系统,有没有 ...
- Redis Server分布式缓存编程
这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...
- 关于java及多线程
http://www.w3cschool.cc/java/java-multithreading.html
- web 开发之js---ajax 中的两种提交方式ajax post 和 ajax get 实例
()post http://04101334.iteye.com/blog/637695/ ()get function serializeElement(element) { var method ...
- UVa 10773 - Back to Intermediate Math
题目:渡河问题.给你河水宽度,水流速度,求垂直渡河与最快渡河的时间差. 分析:物理题,数学题. 最快渡河情况,传垂直运动,垂直渡河,船的水平分速度和水流速度抵消. 说明:注意水流速度不能为0. #in ...