嵌套矩形问题(初级)算法竞赛紫书

题目描述

有 n 个矩形,每个矩形可以用 a,b来描述,表示长和宽。矩形 X(a,b)可以嵌套在矩形 Y(c,d)中当且仅当 a
(相当于旋转 90 度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,

使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。

输入

第一行是一个正正数 N(0
每组测试数据的第一行是一个正正数 n,表示该组测试数据中含有矩形的个数 (n≤1000)。

随后的 n 行,每行有两个数 a,b(0

 

输出

每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行。

样例输入

1
10
1 2
2 4
5 8
6 10
7 9
3 1
5 8
12 10
9 7
2 2

样例输出

5

解题思路:d(i,G)这个函数,表示的是,从矩形i出发的最长路长度,递归最好是debug去走一走,不要太深究。

先用自己的脑袋想一想,如果是人为的去数嵌套的矩形,应该怎么数呢

找到一个矩形A,然后再找到比这个矩形还要大的矩形B,然后找到比B大的矩形C……依次这样找

那我们的最多矩形个数,是不是应该先找到最小的那个矩形,然后找下一个比他大一点的,依次。

得到的一个想法就是:转换成求最长路的问题!DFS!

import java.util.Scanner;

public class Main {

	/**
	 * @param args
	 */
	static int t[];
	static int n=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int N=in.nextInt();//N组数据
		while(N-->0){
		n=in.nextInt();//矩形的个数n
		int arr[][]=new int[n][2];
		for(int i=0;imax){//取最大的路径
				max=d(i,G);
			}
		}
		
		System.out.println(max);}
	}

	private static int d(int i, int[][] G) {
		// TODO Auto-generated method stub
		int ans=t[i];
		if(ans>0)return ans;//如果我已经走过i的所有连通图,那么我就直接返回,防止多遍历的情况,记忆划!
		ans=1;//每个矩形初始路径都是1撒
		for(int j=0;j

你可能感兴趣的:(嵌套矩形问题(初级)算法竞赛紫书)