【Codeforces 4D】Mysterious Present

【链接】 我是链接,点我呀:)
【题意】

要求长度和宽度都严格递增(选择一个序列) 然后你一开始有一个长度和宽度 要求这个一开始所给的长度和宽度能接在你选择的一段连续的长度宽度的开头 (且保持原来的性质) 问你这个最长序列是什么.并打印

【题解】

将信件按照w,h两个关键字分别上升的顺序排序 然后做个dp f[i]表示以i作为开头能够得到的最长序列长度 并标记它下一个转移到了哪里 f[i] = max{f[j]+1} w[i]

【代码】

import java.io.*;
import java.util.*;

public class Main {
	
	
	static InputReader in;
	static PrintWriter out;
		
	public static void main(String[] args) throws IOException{
		//InputStream ins = new FileInputStream("E:\rush.txt");
		InputStream ins = System.in;
		in = new InputReader(ins);
		out = new PrintWriter(System.out);
		//code start from here
		new Task().solve(in, out);
		out.close();
	}
	
	static int N = (int)1e6;
	
	static class Pair implements Comparable<Pair>{
		int w,h,id;
		
		public Pair(int w,int h,int id) {
			this.w = w;
			this.h = h;
			this.id = id;
		}
		
		@Override
		public int compareTo(Pair o) {
			// TODO Auto-generated method stub
			if (this.w!=o.w) {
				return this.w-o.w;
			}else {
				return this.w-o.w;
			}
		}
	}
	
	
	static class Task{
		static int N = 5000;
		
		public void solve(InputReader in,PrintWriter out) {
			int n,w0,h0;
			n = in.nextInt();w0 = in.nextInt();h0 = in.nextInt();
			Pair []a = new Pair[N+10];
			int []f = new int[N+10];
			int []nex = new int[N+10];
			
			for (int i = 1;i <= n;i++)  a[i] = new Pair(in.nextInt(),in.nextInt(),i);
			
			Arrays.sort(a,1,n+1);
			
			for (int i = n;i >= 1;i--) {
				f[i] = 1;
				nex[i] = i;
				for (int j = i+1;j <= n;j++) {
					if (a[j].h>a[i].h && a[j].w>a[i].w && f[j]+1>f[i]) {
						f[i] = f[j]+1;
						nex[i] = j;
					}
				}
			}
			int ans = 0;
			int idx = 0;
			for (int i = 1;i <= n;i++)
				if (a[i].h>h0 && a[i].w>w0) {
					if (f[i]>ans) {
						ans = f[i];
						idx = i;
					}
				}
			out.println(ans);
			for (int i = 1;i <= ans;i++) {
				out.print(a[idx].id+" ");
				idx = nex[idx];
			}
		}
	}

	

	static class InputReader{
		public BufferedReader br;
		public StringTokenizer tokenizer;
		
		public InputReader(InputStream ins) {
			br = new BufferedReader(new InputStreamReader(ins));
			tokenizer = null;
		}
		
		public String next(){
			while (tokenizer==null || !tokenizer.hasMoreTokens()) {
				try {
				tokenizer = new StringTokenizer(br.readLine());
				}catch(IOException e) {
					throw new RuntimeException(e);
				}
			}
			return tokenizer.nextToken();
		}
		
		public int nextInt() {
			return Integer.parseInt(next());
		}
	}
}
原文地址:https://www.cnblogs.com/AWCXV/p/10368244.html