1027_带权活动选择

1027_带权活动选择


这题做的比较顺利,迫不及待想记录一下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;

//定义活动结构体,x表示活动开始时间,y表示活动结束时间,value表示这个活动的权重
struct activity {
	int x;
	int y;
	int value;
};
//按照活动结束时间排序,这是预处理
void SortByEndtime(activity a[], int start, int end) {
	if (start>=end)  return;
	activity ac_base = a[start];
	int base = a[start].y;
	int i = start;
	int j = end;
	activity temp;
	while (i < j) {
		while (a[j].y >= base && i < j) j--;
		while (a[i].y <= base && i < j) i++;
		if (i < j)
		{
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}

	}
	a[start] = a[i];
	a[i] = ac_base;
	SortByEndtime(a, start, i - 1);
	SortByEndtime(a, i + 1, end);
}
//这是找第一个和活动i不冲突的活动序号
int noco(activity a[], int i) {   //和i不冲突的第一个活动
	if (i <= 1)
		return 0;
	int i_start_time = a[i].x;
	for (int j=i-1; j >= 1; j--) {
		if (a[j].y <= i_start_time)
			return j;
	}
	return 0;
}

//tool函数
int max(int a, int b) {
	return a > b ? a : b;
}

 
int main() {
	int M;
	cin >> M;
	for (int iii = 0; iii < M; iii++) {
		int N;
		cin >> N;
		activity* a;
		a = new activity[N+1];
		for (int j = 1; j < N + 1; j++) {
			cin >> a[j].x >> a[j].y >> a[j].value;
		}
		SortByEndtime(a, 1, N);   //step1. 按照活动结束时间排序
		int* f;                
		f = new int[N + 1];       //用动态规划,f[i]表示活动1,2,……i中,选择得到的权重最大值
		f[0] = 0;
		f[1] = a[1].value;
		for (int i = 2; i < N + 1; i++) {
			f[i] = max(f[i - 1], a[i].value + f[noco(a, i)]); //动态规划递推式f[i - 1]表示不选活动i,a[i].value + f[noco(a, i)]表示选活动i,那么就是i的value加上和它不冲突的活动的f
		}

		cout << f[N] << endl;

	}



}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java编程是一种面向对象的编程语言,广泛应用于软件开发领域。下面我将为您介绍活动选择问题和带权活动选择问题。 1. 活动选择问题(Activity Selection Problem): 活动选择问题是指在给定一组活动的开始时间和结束时间之后,找到最大的互不相交的活动子集。目标是选择尽可能多的活动,使它们不会相互冲突。 解决该问题的常用算法是贪心算法。具体步骤如下: - 首先,将所有活动按照结束时间进行排序。 - 选择第一个活动作为选定的活动。 - 从剩余的活动选择下一个结束时间不早于当前选定活动的开始时间的活动,并将其加入选定的活动集合。 - 重复上述步骤,直到所有活动都被考虑完毕。 2. 带权活动选择问题(Weighted Activity Selection Problem): 带权活动选择问题是在活动选择问题的基础上引入了每个活动的权重。每个活动除了有开始时间和结束时间外,还有一个与之相关联的权重值。目标是选择一组活动,使得它们的权重之和最大。 解决该问题的方法可以使用动态规划。具体步骤如下: - 首先,将所有活动按照结束时间进行排序。 - 创建一个数组dp,dp[i]表示以第i个活动结尾的最大权重和。 - 对于每个活动i,计算dp[i]的值,即选择前面结束时间不与当前活动冲突的活动j,计算dp[i] = max(dp[i], dp[j] + 权重[i])。 - 最后,找到dp数组中的最大值,即为最大权重和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值