数据范围这么小..怎么乱搞都可以吧...
先排序一遍然后O(n²) dp
------------------------------------------------------------------
#include<bits/stdc++.h>
using namespace std;
const int maxn = 109;
struct R {
int x, y;
inline void Read() {
scanf("%d%d", &x, &y);
if(x < y) swap(x, y);
}
bool operator < (const R &o) const {
return x > o.x || x == o.x && y > o.y;
}
} A[maxn];
int dp[maxn];
bool ok(int a, int b) {
return A[a].x > A[b].x && A[a].y >= A[b].y || A[a].x >= A[b].x && A[a].y > A[b].y;
}
int main() {
int N;
cin >> N;
for(int i = 0; i < N; i++) A[i].Read();
sort(A, A + N);
for(int i = 0; i < N; i++) {
dp[i] = 1;
for(int j = 0; j < i; j++)
if(ok(j, i))
dp[i] = max(dp[i], dp[j] + 1);
}
cout << *max_element(dp, dp + N) << "
";
return 0;
}
-------------------------------------------------------------------
3359: [Usaco2004 Jan]矩形
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 11 Solved: 7
[Submit][Status][Discuss]
Description
给出N个矩形(1≤N≤100)和它的长和宽(不超过1000),写一个程序找出最大的K,使得
有K个矩形满足层层包含的关系,即里层的矩形被所有外层的矩形包含.一个矩形P1包含另一个
矩形P2,则P2的一边小于P1的一边,并且P9的另一边不超过P1的另一边.如果两个矩形相同,视为不包含.如2 x 1的矩形被2x2的矩形包含,不被1 x 2的矩形包含.
注意:矩形的顺序可以是任意的,且矩形可以旋转.
Input
第1行:整数N.
第2到N+1行:矩形的长和宽,均为整数.
Output
一行,输出最大的包含数K.
Sample Input
4
8 14
16 28
29 12
14 8
8 14
16 28
29 12
14 8
Sample Output
2