区间调度问题:贪心算法求解最大价值和
这是一个经典的区间调度问题,可以使用贪心算法来解决。
首先,根据区间的右端点进行升序排序。
然后,从第一个区间开始,依次选择下一个与当前区间不重叠的区间,并将其加入选择的区间列表中。具体选择的方法是,如果下一个区间的左端点大于当前区间的右端点,则认为它们不重叠,可以选择加入。
最后,计算选择的区间的价值和即可。
下面是使用C++实现的代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 区间结构体
struct Interval {
int start, end, value;
};
// 比较函数,用于排序
bool cmp(const Interval& a, const Interval& b) {
return a.end < b.end;
}
int maxIntervalValue(vector<Interval>& intervals) {
// 根据区间的右端点进行升序排序
sort(intervals.begin(), intervals.end(), cmp);
int n = intervals.size();
vector<int> dp(n); // dp[i]表示以第i个区间结尾的最大价值和
dp[0] = intervals[0].value;
for (int i = 1; i < n; i++) {
dp[i] = intervals[i].value;
for (int j = 0; j < i; j++) {
// 如果第j个区间与第i个区间不重叠,则可以将第i个区间加入选择的区间列表中
if (intervals[j].end <= intervals[i].start) {
dp[i] = max(dp[i], dp[j] + intervals[i].value);
}
}
}
// 找到最大价值和
int maxVal = 0;
for (int i = 0; i < n; i++) {
maxVal = max(maxVal, dp[i]);
}
return maxVal;
}
int main() {
int n;
cin >> n;
vector<Interval> intervals(n);
for (int i = 0; i < n; i++) {
cin >> intervals[i].start >> intervals[i].end >> intervals[i].value;
}
int maxVal = maxIntervalValue(intervals);
cout << maxVal << endl;
return 0;
}
输入样例:
6
1 4 5
3 5 8
0 6 3
5 7 2
3 8 6
5 9 4
输出样例:
14
原文地址: https://www.cveoy.top/t/topic/o8om 著作权归作者所有。请勿转载和采集!