问题一:
矩形嵌套问题: 给定n个矩形,每个矩形有个长和宽,只有当一个矩形的长宽小于另外一个矩形的长宽时,才能嵌套在另外一个矩形内部。求出尽量多的矩形排成一行,嵌套的矩形数目最多。
这个问题其实就是求最长上升子序列,只不过比较大小的时候变成了比较两个变量。
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 1003; struct rect { int l, w; bool operator < (const rect &b) const { return w < b.w && l < b.l; } }; bool cmp(const rect &a, const rect &b) { if (a.l != b.l) return a.l < b.l; return a.w < b.w; } rect r[maxn]; int dp[maxn]; int main() { int T, n; cin >> T; while (T--) { cin >> n; for (int i = 0; i < n; i++) { cin >> r[i].l >> r[i].w; if (r[i].l < r[i].w) swap(r[i].l, r[i].w); dp[i] = 1; } sort(r, r + n, cmp); int ans = 1; for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (r[j] < r[i] && dp[i] < dp[j] + 1) { dp[i] = dp[j] + 1; } } ans = max(ans, dp[i]); } printf("%d\n", ans); } return 0; }