社区讨论

听说灌水区大佬多

灌水区参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lzknge0l
此快照首次捕获于
2024/08/08 10:19
2 年前
此快照最后确认于
2024/08/08 11:07
2 年前
查看原帖
站外题求助

题目描述

数轴上有 nn 条线段,线段的两端都是整数坐标(0(0~1000000)1000000),每条线段的价值不同。
请从nn条线段中挑选出若干条,使得这些线段互不重叠(端点可以重叠),并且这些线段总价值最大。

输入格式

第一行一个整数nn
之后的nn行,每行3个整数分别代表线段左端点、线段右端点、线段价值

输出格式

符合题目要求的最大总价值

样例数据

样例输入1

3
0 2 20
2 4 25
1 3 40

样例输出1

45

数据范围

对于30%的数据,1n201\le n \le 20,左右端点不超过10001000
对于100%的数据,1n10001\le n \le 1000,左右端点不超过10000001000000
我的代码 18pts
CPP
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct ckl{
	int l;
	int r;
	int m;
}a[1005];
int cmp(ckl a,ckl b){
	return a.l<b.l;
}
int n,maxn;
int dp[1005];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].m);
	sort(a+1,a+n+1,cmp);
    dp[1]=a[1];
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(a[j].r<=a[i].l){
				dp[i]=max(dp[j],a[i].m+dp[j]);
			}
		}
		if(dp[i]>maxn)
			maxn=dp[i];
	}
	printf("%d",maxn);
	return 0;
}
救救孩子吧!!!

回复

5 条回复,欢迎继续交流。

正在加载回复...