UVa 103 - Stacking Boxes

/*UVa 103 - Stacking Boxes
 * */
import java.util.Arrays;
import java.util.Scanner;

class Main {
	public static final int MAXD = 15;// 最大维数
	public static final int MAXN = 35;// 最大box数目
	int[][] g = new int[MAXN][MAXN];
	int[] d = new int[MAXN];// 从i出发的最大长度
	int[][] box = new int[MAXN][MAXD];

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		Main m = new Main();
		while (scanner.hasNext()) {
			int k = scanner.nextInt();
			int n = scanner.nextInt();
			Arrays.fill(m.d, 0);
			for (int i = 0; i < MAXN; i++) {
				Arrays.fill(m.g[i], 0);
				Arrays.fill(m.box[i], 0);
			}
			for (int i = 1; i <= k; i++) {
				for (int j = 1; j <= n; j++) {
					m.box[i][j] = scanner.nextInt();
				}
				Arrays.sort(m.box[i], 1, n + 1);// n+1 不包含在内
				for (int j = 1; j < i; j++) {
					if (m.in(i, j, n)) {// box[j]可以被box[i]包含
						m.g[j][i] = 1;
					} else if (m.in(j, i, n)) {
						m.g[i][j] = 1;
					}
				}
			}
			int max = 1, index = 1;
			for (int i = 1; i <= k; i++) {
				int t = m.dp(i, k);
				if (t > max) {
					max = t;
					index = i;
				}
			}
			System.out.println(max);
			m.print(index, k);
			System.out.println();
		}
	}

	private boolean in(int i, int j, int n) {
		int[] t1 = box[i];
		int[] t2 = box[j];
		for (int k = 1; k <= n; k++) {
			if (t1[k] <= t2[k])
				return false;
		}
		return true;
	}

	private int dp(int i, int k) {
		if (d[i] > 0)
			return d[i];
		d[i] = 1;
		for (int j = 1; j <= k; j++) {
			if (g[i][j] == 1) {
				int temp = dp(j, k) + 1;
				if (temp > d[i])
					d[i] = temp;
			}
		}
		return d[i];
	}

	private void print(int i, int k) {
		System.out.printf("%d ", i);
		for (int j = 1; j <= k; j++) {
			if (g[i][j] == 1 && d[i] == d[j] + 1) {
				print(j, k);
				break;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值