Luogu P1280 尼克的任务题解

Posted lixiao189

tags:

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

思路

首先我们需要知道主角可以休息的最多的时间,那么我们可以设(dp[i])为第(i)分钟可以休息的最大时间那么我们可以发现假如第(i)分钟没有主角没有任何任务,那么主角就可以放心休息转移方程为(dp[i] = dp[i + 1] + 1)。如果主角在当前第(i)分钟里面有任务那么在(i sim i + t - 1)这段时间里面就别想休息了((t)为当前任务的时间)。所以我们可以得到转移方程为(dp[i] = dp[i + t]) 最后注意一下枚举的顺序就可以了。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e4 + 5 ;
int n, k;
int book[N];
int dp[N];
struct STR {
 int ts; //任务开始的时间
 int t; //任务持续的时间
} Str[N];
int read() {
 int s = 0, w = 1;
 char ch = getchar();
 while (ch < '0' || ch > '9') {
 if (ch == '-') w = -1;
 ch = getchar();
 }
 while (ch >= '0' && ch <= '9') {
 s = s * 10 + ch - '0';
 ch = getchar();
 }
 return s * w;
}
void write(int x) {
 if (x < 0) putchar('-'), x = -x;
 if (x > 9) write(x / 10);
 putchar(x % 10 + '0');
}
int main(int argc, char const *argv[]) {
 n = read(), k = read();
 for (register int i = 1; i <= k; ++i) {
 Str[i].ts = read(), Str[i].t = read();
 book[Str[i].ts] = 1; //标记开始的时间
 }
 for (register int i = n; i >= 1; --i) { //枚举时间
 if (!book[i]) {
 dp[i] = dp[i + 1] + 1;
 continue;
 }
 for (register int j = 1; j <= k; ++j) { //枚举任务
 if (Str[j].ts == i)
 dp[i] = max(dp[i], dp[i + Str[j].t]);
 }
 }
 write(dp[1]);
 return 0;
}

以上是关于Luogu P1280 尼克的任务题解的主要内容,如果未能解决你的问题,请参考以下文章

题解 P1280 尼克的任务

luogu P1280 尼克的任务 序列DP

P1280 尼克的任务

线性状态动态规划 P1280 尼克的任务资源分配型动态规划

P1280 尼克的任务

P1280 尼克的任务