您的位置:首页 > 其它

UVa 103 - Stacking Boxes

2013-06-16 11:12 471 查看
/*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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: