大致思路:
剛開始我就是覺得好難啊,我覺得藍橋杯的大題可能就這個差不多了!但是我真的沒想出來,我還想是不是要用啥子拓撲排序哦,他確實是很「線性」的,但是拓撲排序只是指明「先後關係」,你這兒弄麼複雜多樣的先後關係真的不好建圖的。
咋法用「線性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分起開始工作...