給定 n ≤ 1000 個矩形,每個以 (a,b) 表示長寬。矩形 X 可嵌套進 Y 若 ab
(min(a,b), max(a,b)),即短邊在前dp[i]:以第 i 個矩形為結尾的最長鏈長度dp[i] = max(dp[j]) + 1,對所有 j < i 且 rect[j] 可嵌套進 rect[i]稠密圖 (n=1000 邊數近 5×10⁵) 用 vector 會因動態分配導致 TLE。改用靜態陣列鄰接表:
struct Edge { int to, next; } e[MAXE];
int head[MAXN], ecnt;
void addEdge(int u, int v) {
e[ecnt] = {v, head[u]};
head[u] = ecnt++;
}
或直接用鄰接矩陣 bool g[MAXN][MAXN](1000² = 1e6,約 1 MB),建圖與查詢均為 O(1),實測 12 ms 通過。
int dfs(int u) {
if (dp[u]) return dp[u];
int ans = 1;
for (int i = head[u]; ~i; i = e[i].next)
ans = max(ans, dfs(e[i].to) + 1);
return dp[u] = ans;
}
int main() {
// ... 讀入、標準化、排序 ...
for (int i = 0; i < n; ++i)
for (int j = i+1; j < n; ++j)
if (rect[i].x < rect[j].x && rect[i].y < rect[j].y)
addEdge(i, j);
int res = 0;
for (int i = 0; i < n; ++i) res = max(res, dfs(i));
printf("%d\n", res);
}
vector 擴容開銷j > i,天然無環,DFS 無需訪問標記