ブルーブリッジカップ-重複しない線分を改善するアルゴリズム(Java)

リソース制限
時間制限:1.0sメモリ制限:256.0MB
問題の説明
  数直線上のn個の線分の左端と右端の座標l、r、およびそれらの値vを考慮して、共通点のない線分の数を選択してください(エンドポイントの一致も共通点があると見なされます)。そのため、それらの値の合計が最大になり、最大値の合計が出力されます。
入力形式
  最初の行は正の整数nです。

次のn行、3つの整数l、r、vの各行は、それぞれ線分の左端、右端、および値を表します。l <r、v>0。
出力形式
  最大値と合計を表す整数を出力します。
サンプル入力413
4
3
5 7
5 7 3 268サンプル出力
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;
	}
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/QinLaoDeMaChu/article/details/108704153