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的更多相关文章

  1. 洛谷 P1280 尼克的任务 (线性DP)

    题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...

  2. P1280 尼克的任务 线性DP

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  3. Luogu P1541 乌龟棋 【线性dp】

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行 N 个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟 ...

  4. Luogu P1280 尼可的任务(dp)

    题意: 时间为n,有k个任务,每个任务有一个开始时间和持续时间,从第一分钟开始,如果有开始的任务就要做,问最大空闲时间 n,k<=1e5 思路: 设 dp[i]为i~n时间中最大空闲时间,vec ...

  5. 线性dp

    线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...

  6. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  7. 线性DP总结(studying

    写在前面 虽然都说线性DP是入门,但我还是今天才开始学 线性DP就是珂以通过线性处理得出答案的一种DP 每一种状态都可以从前面推得,并且推导过程是呈线性的 参考题单(本人现在主要用luogu,所以这些 ...

  8. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  9. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

随机推荐

  1. response对象学习

    import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...

  2. [Bash] Move and Copy Files and Folders with Bash

    In this lesson we’ll learn how to move and rename files (mv) and copy (cp) them. Move index.html to ...

  3. Leetcode:search_insert_position

    一.     题目 给定一个数组和要插入数的大小.求插入的位置. 二.     分析 太水,直接扫描.过--. class Solution { public: int searchInsert(in ...

  4. fedora下安装xdot和objgraph

    前提:安装好了python 1.先下载xdot-0.6.tar.gz和objgraph-1.8.0-py27-none-any.whl,你也可以在官网上下载其他版本. 2.下载完后,解压. 3.打开终 ...

  5. 设计模式C++实现_2_简单工厂模式

    简单工厂模式 主要用于创建对象. 新加入类时. 不会影响曾经的系统代码. 核心思想是用一个工厂来依据输入的条件产生不同的类,然后依据不同类的 virtual 函数得到不同的结果. 以下以苹果手机的生产 ...

  6. C++标准库和stl差别

    C++库文件夹:开发工具和语言-visual studio文档-visual C++-參考信息-库參考-standard C++ library C#库文件夹:C#使用.NET Framework 类 ...

  7. Eclipse 变量点击高亮显示以及自己定义高亮显示颜色

    1.方法一:alt+shift+o 打开/关闭,该功能 2.方法二:windows-> preferences->java->Editor->Mark Occurences ( ...

  8. java8--IO工具类(java疯狂讲义3复习笔记)

    Paths类 public static void pathTest(){ Path path = Paths.get("~"); System.out.println(path) ...

  9. 头文件与cpp文件为什么要分开写

    最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以  类.模版.函数等一系列的声明,让程序员知道应该怎么调用里面的"东西". 从动态链接库的角度看: 头文件提供界面 ...

  10. Override is not allowed when implementing interface method Bytecode Version Overriding and Hiding Methods

    java - @Override is not allowed when implementing interface method - Stack Overflow https://stackove ...