動態規劃(一)

2021-10-07 15:17:10 字數 968 閱讀 1909

題目描述:

有n個任務,每個任務有起始時間點,結束時間點,獲得的報酬。同一時間不能同時做兩個任務,問最多可以獲得多少的報酬。

解題思路:

陣列:

pre:儲存每個任務前乙個能做的任務(要做當前任務的情況下)

opt:儲存前i個任務的最優解

關鍵思想:為了讓資料更有序,按照每個任務的結束時間以公升序進行排序。每個任務有選或不選兩種選擇。前i個任務的最優解是 前i-1個任務的最優解(不選擇當前任務) 和 當前任務的報酬+前乙個最接近當前任務(不與當前任務重疊的任務,即pre[i])的最優解(選擇當前任務) 中的最優解

測試資料:

859

3145

4741

6838

66102

81143

51

**:
#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

struct work

;bool

mysort

(work a,work b)

intmain()

sort

(work+

1,work+n+

1,mysort)

;for

(int i=

1;i<=n;i++)}

} opt[1]

=work[1]

.money;

for(

int i=

2;i<=n;i++

) cout<

}

動態規劃 一

在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...

動態規劃(一)

動態規劃的兩種常用形式 1 遞迴型 在函式中呼叫自身 優點 直觀,容易編寫 缺點 可能會因為遞迴層數太深導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說,比遞推型慢。2 遞推型 for迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...

動態規劃 (一)

對於動態規劃的學習總共進行了兩節課,到現在為止還是一頭霧水,雖然看懂了老師上課講的例題,但是做v judge的時候還是都不太會,我主要認為我只知道了動態規劃的基本思想,就是將乙個大的問題,分成若干個小問題,但與貪心演算法不同的是,動態規劃中的每乙個小問題之間都相互影響,在每一步都取得最優解,且在不斷...