dp 重要 尼克的任務

2021-08-20 03:29:19 字數 1092 閱讀 6912

大致思路:

剛開始我就是覺得好難啊,我覺得藍橋杯的大題可能就這個差不多了!但是我真的沒想出來,我還想是不是要用啥子拓撲排序哦,他確實是很「線性」的,但是拓撲排序只是指明「先後關係」,你這兒弄麼複雜多樣的先後關係真的不好建圖的。

咋法用「線性dp」做嘛?

其實,別忽略了:揹包問題也是線性dp。而這道題,是有點揹包問題的感覺的——做不做這個任務,要求的是最大空暇時間。

這裡就要對這種問題再增強一些理解了:首先我們還是老樣子,讓dp[i]表示1~i時刻的最大空暇時間,那麼現在來結合題意想想尼克的選擇(對於揹包問題是拿和不拿)以及狀態轉移:對於這個問題是:如果當前時刻沒有任務,則空暇時間dp[i]=dp[i-1]+1;如果當前時刻有任務,如果做任務則dp[i]=???這裡就懵逼了,我當前時刻做任務和之前的時刻有啥子關係呢?只跟我後面的結束時間有關即dp[結束i]=dp[開始i] 。但是很顯然這樣改的話,首先狀態轉移的乙個結構就亂了,再來,如果有多個任務,我還得用max函式,但dp[結束i]在之前並沒有賦值,咋個比較出個最大值最優解從而曉得選擇做哪個任務喃?

因此,需要從後往前來遍歷。即需要修改dp[i]的含義——i~n時刻的最大空暇時間。這樣我通過比較dp[開始i] 多個dp[結束i] (而dp[結束i]都已知)就能知道選擇做哪個任務最優了。而空閒的時候dp[i]=dp[i+1]+1就是對的,因為含義變了嘛。

ac**(直接copy的,本人趕時間0.0):

#include#includeusing namespace std;  

long int n,k,sum[10001],num=1,f[10001];

struct ren//結構體,一起排序 ,從大到小

; ren z[10001];

int cmp(ren a,ren b)

int main()

sort(z+1,z+k+1,cmp);

for(i=n;i>=1;i--)//倒著搜

} cout<

}

尼克的任務DP

尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完戍,尼克可以任選其中的乙個來做,而其...

線性DP 尼克的任務

尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的乙個來做,而其...

尼克的任務 線性dp

p1280 尼克的任務 洛谷 電腦科學教育新生態 luogu.com.cn 一道線性dp的基礎題。但是狀態方程自己想複雜了。剛開始是想用二維陣列表示,選擇i項工作後時間到j的總工作時長最小是多少,然後用總時間減它。很麻煩,而且不會寫.然後看了題解,發現只需要一維陣列即可。狀態表示是從第i分起開始工作...