動態規劃 3

2021-08-15 14:46:29 字數 1640 閱讀 6139

尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。

尼克的乙個工作日為n分鐘,從第一分鐘開始到第n分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完成,尼克可以任選其中的乙個來做,而其餘的則由他的同事完成,反之如果只有乙個任務,則該任務必需由尼克去完成,假如某些任務開始時刻尼克正在工作,則這些任務也由尼克的同事完成。如果某任務於第p分鐘開始,持續時間為t分鐘,則該任務將在第p+t-1分鐘結束。

寫乙個程式計算尼克應該如何選取任務,才能獲得最大的空暇時間。

輸入格式:

輸入資料第一行含兩個用空格隔開的整數n和k(1≤n≤10000,1≤k≤10000),n表示尼克的工作時間,單位為分鐘,k表示任務總數。

接下來共有k行,每一行有兩個用空格隔開的整數p和t,表示該任務從第p分鐘開始,持續時間為t分鐘,其中1≤p≤n,1≤p+t-1≤n。

輸出格式:

輸出檔案僅一行,包含乙個整數,表示尼克可能獲得的最大空暇時間。

輸入樣例#1:

複製

15 6

1 21 6

4 11

8 58 1

11 5

1280 尼克的任務

1.子任務 第i時刻尼克是否有任務可選 如果有,選哪個歇的時間更長

2.定義狀態

在前i時刻尼克最多歇多久(最少工作多久)?

3.狀態轉移

本題要倒著推 及從大的時間往小的時間轉移 因為 如果正著 在i的時候 顯然還沒轉移 i+t

考慮如果 i時刻沒有任務 則 從i+1秒 到第 i 秒可以歇著 就爽歪歪。

如果有任務 就 從這幾個任務中 選擇乙個(根據程式選擇輕鬆地,就美滋滋!)

及 dp【i】=dp【i+1】+1;

或 if t【j】。s==i

dp【i】=max(dp【i+t【j】。e】,dp【i】);

具體看**吧!

對了在解釋乙個問題 sort對於這題而言 如果你要 每次花j的複雜度掃下的話 拍不排序無所謂 ,但是排序後 你可以根據時間的單調性優化,

及每次並不用掃完 就可以用特判結束

不排序 複雜度(確界) nk

排序 (上界)nk +(下界)klogk 上界 (k^2) (排序只討論sort)

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct

node

t[10000];

int dp[10000];

int st[100009];

intcmp

(node a,node b)

int n,m,k;

intmain

()sort(t+1,t+1+n,cmp);

dp[n+1]=0;

for(int i=n;i>=1;i--)

else

}}cout

<1]

0;}

輸出樣例#1:

複製

4

動態規劃(3)

robberies include include include includeusing namespace std 這題是參考的 自己的能力還是不可以。不過做了這題,再和0 1揹包問題想一想,覺得收穫還是不錯。說將逃跑率當成物品價值 小弟還是要繼續消化這條題的思想。double f 10020...

3動態規劃

此次專題主要講解動態規劃,題目大致分為兩類 一種是遞迴來解決,一種是0 1揹包問題。動態規劃就是把乙個問題分成多個階段來解決,並且每個階段都相互有所聯絡。其遵循最優性原理。1,不論初始狀態和第一步決策是什麼,餘下的決策相對於前一次決策所產生的新狀態,構成乙個最優決策序列。2,最優決策序列的子串行,一...

ITA 動態規劃3

動態規劃,雙調歐幾里得旅行商問題 旅行商問題描述 平面上n個點,確定一條連線各點的最短閉合旅程。這個解的一般形式為np的 在多項式時間內可以求出 bentley 建議通過只考慮雙調旅程 bitonictour 來簡化問題,這種旅程即為從最左點開始,嚴格地從左到右直至最右點,然後嚴格地從右到左直至出發...