尼克的任务 dp 洛谷1280
生活随笔
收集整理的這篇文章主要介紹了
尼克的任务 dp 洛谷1280
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
蒟蒻表示老久沒看過dp題目了,,挺水的一道dp題目都沒想出來,,,
首先設dp[i]表示從開始到i時間的最大空閑時間,用vector to[x] 表示從x點開始的任務結束時間,cnt[x]表示從x開始的任務個數,初始化dp[i] i = 1 -> n 為 -1, dp[0]為0
轉移時,對于dp[i],如果dp[i-1] 為 -1,無法完成轉移
如果dp[i-1] > 0分兩種情況
1、如果i時刻無任務,直接dp[i] = max{dp[i], dp[i-1] + 1}
2、如果i時刻有任務,枚舉任務,使dp[to[i][j]] = max{dp[to[i][i]],dp[i-1]}
輸出dp[n]即為結果
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <vector>
5
6
7 const int maxn = 10000 + 500;
8 int n, k;
9 std :: vector <int> to[maxn];
10 int dp[maxn], cnt[maxn];
11 int tx, ty;
12
13 int main () {
14 scanf("%d %d", &n, &k);
15 for (int i = 1; i <= k; i++) {
16 scanf("%d %d", &tx, &ty);
17 to[tx].push_back(tx + ty - 1);
18 cnt[tx]++;
19 }
20 for (int i = 1; i <= n; i++) dp[i] = -1;
21 dp[0] = 0;
22 for (int i = 1; i <= n; i++) {
23 if (dp[i-1] >= 0) {
24 if (cnt[i] > 0) {
25 for (int j = 0; j < to[i].size(); j++)
26 dp[to[i][j]] = std :: max(dp[to[i][j]], dp[i-1]);
27 } else {
28 dp[i] = std :: max(dp[i], dp[i-1] + 1);
29 }
30 }
31 }
32 printf("%d", dp[n]);
33 return 0;
34 } ?
??
轉載于:https://www.cnblogs.com/CtsNevermore/p/5993094.html
總結
以上是生活随笔為你收集整理的尼克的任务 dp 洛谷1280的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发-xcdatamodeld文件
- 下一篇: 一个电机多少钱啊?