定義 OPT(i) 為前 i 個活動可產生的最大權重。
定義
定義
故整體時間為 O(nlogn)
#include <iostream>
#include <algorithm>
using namespace std;
struct Job {
int start, finish, weight;
};
bool cmp(Job s1, Job s2) {
return s1.finish < s2.finish;
}
int binarySearch(Job jobs[], int index) {
int low = 0, high = index - 1; // 活動要在 a_i 之前,所以要 index - 1
while (low <= high) {
int mid = (low + high) / 2;
if (jobs[mid].finish <= jobs[index].start) {
// 這裡有微幅修改 BinarySearch
// 先檢查 mid 的下一個有沒有滿足 finish(mid + 1) <= start(index),
// 如果沒有滿足,代表 mid 就是我們要找的最大 index,就可以不用繼續二分搜尋了
if (jobs[mid + 1].finish <= jobs[index].start) low = mid + 1;
else return mid;
}
else high = mid - 1;
}
return -1; // 沒找到,時間都撞到
}
int findMaxWeight(Job arr[], int n) {
sort(arr, arr + n, cmp);
int *table = new int[n];
table[0] = arr[0].weight;
for (int i = 1; i < n; i++) {
int includeWeight = arr[i].weight, q = binarySearch(arr, i);
if (q != -1) includeWeight += table[q];
table[i] = max(includeWeight, table[i-1]);
}
int result = table[n-1];
delete[] table;
return result;
}
int main()
{
Job arr[] = {{3, 10, 20}, {1, 2, 50}, {6, 19, 100}, {2, 100, 200}};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Optimal weight is " << findMaxWeight(arr, n);
}