洛谷P1280 caioj 1085 动态规划入门(非常规DP9:尼克的任务)
生活随笔
收集整理的這篇文章主要介紹了
洛谷P1280 caioj 1085 动态规划入门(非常规DP9:尼克的任务)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這道題我一直按照往常的思路想
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為總時間
后來做到洛谷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; }?
轉載于:https://www.cnblogs.com/sugewud/p/9819413.html
總結
以上是生活随笔為你收集整理的洛谷P1280 caioj 1085 动态规划入门(非常规DP9:尼克的任务)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django celery
- 下一篇: oracle数据库的net manage