这是一个经典的区间调度问题,可以使用贪心算法来解决。

首先,根据区间的右端点进行升序排序。

然后,从第一个区间开始,依次选择下一个与当前区间不重叠的区间,并将其加入选择的区间列表中。具体选择的方法是,如果下一个区间的左端点大于当前区间的右端点,则认为它们不重叠,可以选择加入。

最后,计算选择的区间的价值和即可。

下面是使用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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录