尼克的任務 線性dp

2022-10-09 11:12:08 字數 851 閱讀 2754

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 2

using

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 }

view code

線性DP 尼克的任務

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

尼克的任務DP

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

luogu1280 尼克的任務 (線性dp)

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