这道题我一直按照往常的思路想

f[i]为前i个任务的最大空暇时间

然后想不出来怎么做……

后来看了题解

发现这里设的状态是时间,不是任务

自己思维还是太局限了,题做得太少。

很多网上题解都反着做,那么麻烦干嘛

设f[i]为前i时间内的最大空暇时间。

这里是更新后来的状态,和以前不一样。

如果i为某个任务的开始时间,则

f[i+t-1] = max(f[i+t-1], f[i])

也就是继承过去,取max

如果不是的话

f[i] = max(f[i], f[i-1] + 1)

加上获得的空暇时间

最后输出f[time],time为总时间

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 11234;
int f[MAXN], time, n;
struct node
{
int l, r;
bool operator < (const node& rhs) const
{
return l < rhs.l || (l == rhs.l && r < rhs.r);
}
}a[MAXN]; int main()
{
scanf("%d%d", &time, &n);
REP(i, 1, n + 1) scanf("%d%d", &a[i].l, &a[i].r);
sort(a + 1, a + n + 1); memset(f, -63, sizeof(f));
f[0] = 0;
int p = 1;
REP(i, 1, time + 1)
{
if(a[p].l == i)
{
while(a[p].l == i)
f[i + a[p].r - 1] = max(f[i + a[p].r - 1], f[i-1]), p++;
}
else f[i] = max(f[i], f[i-1] + 1);
}
printf("%d\n", f[time]); return 0;
}

后来做到洛谷P1280,竟然做不出来了,看来对题解还是没有深刻的理解

(1)初始化问题。本来以为全部都是0无所谓的,然后就WA。

因为求最大,所以初始化为最小,同时f[0] = 0

(2)这里推时间是从f[i-1]推,不是f[i]

然后我发现把这个f数组输出来乱七八糟的。

但是答案是对的

有点迷(因为下标是时间??)

最后,这11天过来我的代码风格还是有少许改变的

#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 112345;
int f[MAXN], n, k;
struct node
{
int l, r;
void read() { scanf("%d%d", &l, &r); r = l + r - 1; }
bool operator < (const node& rhs) const
{
return l < rhs.l || (l == rhs.l && r < rhs.r);
}
}a[MAXN]; int main()
{
scanf("%d%d", &n, &k);
REP(i, 0, k) a[i].read();
sort(a, a + k); memset(f, -63, sizeof(f));
f[0] = 0;
int p = 0;
_for(i, 1, n)
{
if(a[p].l == i)
{
while(a[p].l == i)
f[a[p].r] = max(f[a[p].r], f[i-1]), p++;
}
else f[i] = max(f[i], f[i-1] + 1);
}
printf("%d\n", f[n]); return 0;
}

洛谷P1280 && caioj 1085 动态规划入门(非常规DP9:尼克的任务)的更多相关文章

  1. 洛谷P2196 && caioj 1415 动态规划6:挖地雷

    没看出来动规怎么做,看到n <= 20,直接一波暴搜,过了. #include<cstdio> #include<cstring> #include<algorit ...

  2. caioj 1080 动态规划入门(非常规DP4:乘电梯)(dp数组更新其他量)

    我一开始是这么想的 注意这道题数组下标是从大到小推,不是一般的从小到大推 f[i]表示从最高层h到第i层所花的最短时间,答案为f[1] 那么显然 f[i] = f[j] + wait(j) + (j ...

  3. 洛谷P1280 尼克的任务 题解 动态规划/最短路

    作者:zifeiy 标签:动态规划.最短路 题目链接:https://www.luogu.org/problem/P1280 题目大意: 有k个任务分布在第1至n这n个时间点,第i个任务的于第 \(P ...

  4. caioj 1086 动态规划入门(非常规DP10:进攻策略)

    一开始看到题目感觉很难 然后看到题解感觉这题贼简单,我好像想复杂了 就算出每一行最少的资源(完全背包+二分)然后就枚举就好了. #include<cstdio> #include<a ...

  5. caioj 1087 动态规划入门(非常规DP11:潜水员)(二维背包)

    这道题的难点在于价值可以多. 这道题我一开始用的是前面的状态推现在的状态 实现比较麻烦,因为价值可以多,所以就设最大价值 为题目给的最大价值乘以10 #include<cstdio> #i ...

  6. caioj 1084 动态规划入门(非常规DP8:任务安排)(取消后效性)

    这道题的难点在于,前面分组的时间会影响到后面的结果 也就是有后效性,这样是不能用dp的 所以我们要想办法取消后效性 那么,我们就可以把影响加上去,也就是当前这一组加上了s 那么就把s对后面的影响全部加 ...

  7. caioj 1083 动态规划入门(非常规DP7:零件分组)(LIS)

    这道题题目给的顺序不是固定的 所以一开始要自己排序,按照w来排序 后来只要看l就可以了 然后求最长下降子序列即可(根据那个神奇的定理,LIS模板里有提到) #include<cstdio> ...

  8. caioj 1082 动态规划入门(非常规DP6:火车票)

    f[i]表示从起点到第i个车站的最小费用 f[i] = min(f[j] + dist(i, j)), j < i 动规中设置起点为0,其他为正无穷 (貌似不用开long long也可以) #i ...

  9. caioj 1081 动态规划入门(非常规DP5:观光游览)

    这道题和前面的分组的题有点像 就是枚举最后一组的长度. 然后组数可以在第一层循环也可以在第二层循环 我自己的话就统一一下在第一层循环吧 然后这道题题意我一直没理解清楚,浪费了很多时间,写复杂了 同时初 ...

随机推荐

  1. Xshell调整终端显示的最大行数(缓冲区)

    1 选择会话,按顺序点击文件->属性 ,打开"会话属性"窗口 如下 在"会话属性"窗口中选择“终端” 修改缓冲区大小的值:其范围为0~2147483647 ...

  2. 51nod 1110 距离之和最小V3

    X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 * P[i]的权值.求X轴上一点使它到这N个点的带权距离之和最小,输出这个最小的带 ...

  3. javascript----三目运算符

    flag ? $('body').addClass('hover') : $('body').removeClass('hover') ; (expr1) ? (expr2) : (expr3): 与 ...

  4. U盘安装CentOS 7系统

    首先,本文适合新的不能再新的新手 小白出身的轩轩,由于最近正在学习Linux的centos系统,所以突发奇想,为什么不把轩轩的本机也安装一个centos系统呢,让两个系统互不干扰,想到就做到,遂开始动 ...

  5. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  6. Java基础学习总结(4)——对象转型

    一.对象转型介绍 对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型.转型的意思是:如把float类型转成int类型,把double类 ...

  7. 时间就是金钱HNCOI2000(最短路)

    时间就是金钱HNCOI2000 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 人们总是选时间最短或费用最低的路线 例如, ...

  8. centos7.x86_64搭建饥荒服务器

    http://blog.ttionya.com/article-1233.html 在centos7下找不到 libcurl-gnutls.so.4,而且必须要安装32位的才行 yum install ...

  9. [LeetCode]Subsets II生成组合序列

    class Solution {//生成全部[不反复]的组合.生成组合仅仅要採用递归,由序列从前往后遍历就可以. 至于去重,依据分析相应的递归树可知.同一个父节点出来的两个分支不能一样(即不能与前一个 ...

  10. MongoDB学习笔记&lt;七&gt;

    继续MongoDB的学习 1.导出数据(中断其它操作) 把数据库test中的books集合导出 在终端下进行操作 mongoexport -d test -c books -o /home/hadoo ...