p1280 尼克的任務 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
一道線性dp的基礎題。但是狀態方程自己想複雜了。剛開始是想用二維陣列表示,選擇i項工作後時間到j的總工作時長最小是多少,然後用總時間減它。很麻煩,而且不會寫.。。。然後看了題解,發現只需要一維陣列即可。狀態表示是從第i分起開始工作的最大摸魚時間。
問題:為什麼狀態方程不是從第1分鐘開始到第i分鐘結束的最大摸魚時間呢?
因為這樣思考量太大了,還要考慮前幾項工作的最終時長什麼的。所以正難則反,我們的狀態方程設為i分鐘是起點。
狀態計算:
1.如果i時刻沒有工作剛開始,那麼f[i]=f[i+1]+1 (摸魚一分鐘)
2.如果i時刻有工作要剛開始,那麼就在所有i時刻開始的工作中遍歷,求最大的摸魚時長。
f[i]=max(f[i],f[i+num[i][j])
答案所求即為f [ 1 ]
小技巧:用vector記錄每項工作開始時間對應的結束時間,沒必要記錄每項工作的序號。
1 #include 2view codeusing
namespace
std;
3const
int n=1e4+100
;4 vectornum[n];
5int
n,k,p,t,f[n];67
intmain()815
16for(int i=n;i;i--)
1724}25
26 printf("
%d\n
",f[1
]);27
2829
30return0;
31 }
線性DP 尼克的任務
尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的乙個來做,而其...
尼克的任務DP
尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完戍,尼克可以任選其中的乙個來做,而其...
luogu1280 尼克的任務 (線性dp)
題目描述 尼克每天上班之前都連線上英特網,接受他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的乙個...