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;
}
}