资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给出在数轴上的n条线段的左右端点的坐标l,r和它们的价值v,请你选出若干条没有公共点的线段(端点重合也算有公共点),使得它们的价值和最大,输出最大价值和。
输入格式
第一行一个正整数n。
接下来n行,每行三个整数l,r,v分别表示一条线段的左端点,右端点和价值。l<r,v>0。
输出格式
输出一个整数表示最大价值和。
样例输入
4
1 3 4
3 5 7
5 7 3
2 6 8
样例输出
8
数据规模和约定
n<=2000
l,r,v<=1000000
——————————————————————————————————————————————————
参考原文
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
static int[] dp = new int[1000005];
static Edge[] edges = new Edge[2005];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
int l = sc.nextInt();
int r = sc.nextInt();
int v = sc.nextInt();
edges[i] = new Edge(l, r, v);
}
Arrays.sort(edges, 0, n, new Comparator<Edge>() {
@Override
public int compare(Edge o1, Edge o2) {
if (o1.r != o2.r) {
return o1.r - o2.r;
} else {
return o1.l - o2.l;
}
}
});
dp[edges[0].r] = edges[0].v;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (edges[i].l <= edges[j].r){
dp[edges[i].r] = Math.max(dp[edges[i].r], Math.max(edges[i].v, dp[edges[j].r]));
} else {
dp[edges[i].r] = Math.max(dp[edges[i].r], edges[i].v + dp[edges[j].r]);
}
}
}
System.out.println(dp[edges[n-1].r]);
}
}
class Edge {
int l;
int r;
int v;
public Edge(int l, int r, int v) {
super();
this.l = l;
this.r = r;
this.v = v;
}
}