[luoguP1280] 尼克的任务(DP)

Posted 蒟蒻zht的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[luoguP1280] 尼克的任务(DP)相关的知识,希望对你有一定的参考价值。

传送门

 

原本想着 f[i] 表示前 i 个任务的最优答案,但是不好转移

看了题解后,发现是 f[i] 表示前 i 分钟的最优解,看来还是不能死脑筋,思维得活跃,一个思路行不通就换一个思路。

 

把 f 数组置为 -INF,f[0] = 0

如果当前时间不是任务开始的时间,f[i] = max(f[i], f[i - 1] + 1)

如果当前时间是任务开始时间,f[i + b[j] - 1] = max(f[i + b[j] - 1], f[i - 1])

 

——代码

技术分享
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #define N 100001
 5 #define max(x, y) ((x) > (y) ? (x) : (y))
 6 
 7 int n, m;
 8 int a[N], b[N], f[N];
 9 
10 inline int read()
11 {
12     int x = 0, f = 1;
13     char ch = getchar();
14     for(; !isdigit(ch); ch = getchar()) if(ch == -) f = -1;
15     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - 0;
16     return x * f;
17 }
18 
19 int main()
20 {
21     int i, j;
22     n = read();
23     m = read();
24     memset(f, -127 / 3, sizeof(f));
25     f[0] = 0;
26     for(i = 1; i <= m; i++) a[i] = read(), b[i] = read();
27     j = 1;
28     for(i = 1; i <= n; i++)
29     {
30         if(a[j] ^ i) f[i] = max(f[i], f[i - 1] + 1);
31         else while(a[j] == i)
32         {
33             f[i + b[j] - 1] = max(f[i + b[j] - 1], f[i - 1]);
34             j++;
35         }
36     }
37     printf("%d\n", f[n]);
38     return 0;
39 }
View Code

 

以上是关于[luoguP1280] 尼克的任务(DP)的主要内容,如果未能解决你的问题,请参考以下文章

P1280 尼克的任务(DP)

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

洛谷 [P1280] 尼克的任务

P1280 尼克的任务 dp

洛谷OJ 1280 尼克的任务 线性DP

luogu P1280 尼克的任务 序列DP