給定 k ≤ 30 個 n ≤ 10 維箱子。箱子可任意重排維度 (即維度排序後逐維比較)。A 能嵌套進 B ⇔ 排序後 A[i] < B[i] 對所有 i 成立。求最長嵌套鏈 (最多箱子數) 並輸出任一最長鏈的箱子編號 (輸入順序 1-based)。
i → j:箱子 i 能嵌套進 j (sorted[i][d] < sorted[j][d] ∀d)。
int dp[MAXN]; // dp[u] = 以 u 為起點的最長路徑長度
int nxt[MAXN]; // 記錄下一節點用於重構路徑
int dfs(int u) {
if (dp[u]) return dp[u];
dp[u] = 1;
for (int v = 0; v < k; ++v) if (u != v && can_nest(u, v)) {
int len = dfs(v) + 1;
if (len > dp[u]) {
dp[u] = len;
nxt[u] = v;
}
}
return dp[u];
}
bool can_nest(int i, int j) {
for (int d = 0; d < n; ++d)
if (box[i][d] >= box[j][d]) return false;
return true;
}
// 找全局最長起點
int best_len = 0, start = -1;
for (int i = 0; i < k; ++i)
if (dfs(i) > best_len) { best_len = dfs(i); start = i; }
// 輸出路徑 (內層→外層)
for (int u = start; u != -1; u = nxt[u])
cout << (u+1) << (nxt[u]==-1 ? '\n' : ' ');
k, n,多測資至 EOF。k 個箱子,各自 n 維,**每個箱子內部排序**。can_nest 判斷 (k≤30, 完全圖檢查 O(k²n) 微小)。O(k² n) 建圖/檢查 + O(k²) DP,k=30, n=10 極快。O(k²) 或 O(k) (DFS 遞歸棧)。dp, nxt, box。