[洛谷 OJ] P1233 木棍加工

先根据长度从高到低排序,如果长度相同,再根据宽度从高到低排序。

这样,这个问题就转化成了在n个数中,求不下降子序列最少个数。

从dilworth定理中,我们可知,下降子序列的最小划分等于最长不下降子序列的长度

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
	static Scanner sc=new Scanner(System.in);
	static int n,ans=1,k=0;
	static Static[] sta;
	static int[] dp=new int[50000];
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		in.nextToken();
		n=(int)in.nval;
		sta=new Static[n];
		for(int i=0;i cmp=new Comparator() {
			
			@Override
			public int compare(Static o1, Static o2) {
				// TODO Auto-generated method stub
				if(o2.l==o1.l) {
					return o2.w-o1.w;
				}else
					return o2.l-o1.l;
			}
		};
		Arrays.sort(sta,cmp);
		//求sta.l的最长上升子序列
		int[] ch=new int[n];
		ch[0]=sta[0].w;
		for(int i=1;ich[j]&&dp[j]+1>dp[i]) {
					dp[i]++;
				}
			}
		}
		Arrays.sort(dp,0,n);
		System.out.println(dp[n-1]);

	}

}
class Static{
	int l;
	int w;
}

 

你可能感兴趣的:(洛谷,OJ)