题目链接:
http://codevs.cn/problem/3641/
思路:
由题意知,对于i和j两个人,IQ[i]>=IQ[j]时,必有EQ[i] >= EQ[j],否则出错
算法:
1. 对所有人按照IQ排序
2. 求EQ的最长不降子序列
即:
if (p[i].a >= p[j].a && p[i].b >= p[j].b){ // 有等于号'='!
dp[i] = max(dp[i], dp[j] + 1);
}
C++代码如下:
// 1.将所有人IQ(或者EQ)从小到大排序。
// 2.求EQ(或者IQ )的最长非递减子序列长度.
//if (p[i].a >= p[j].a && p[i].b >= p[j].b){ // 有等于号'='!
// dp[i] = max(dp[i], dp[j] + 1);
// }
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxn = 1005;
struct person
{
int a, b;
bool operator<(const person &x)const{
if (a == x.a) return b < x.b;
return a < x.a;
}
}p[maxn];
int dp[maxn];
int main()
{
int n;
while (cin >> n && n){
memset(p, 0, sizeof(p));
for (int i = 0; i < n; i++){
// scanf("%d%d", &p[i].a, &p[i].b);
cin >> p[i].a >> p[i].b;
dp[i] = 1;
}
sort(p, p + n);
for (int i = 0; i < n; i++){
for (int j = 0; j < i; j++){
if (p[i].a >= p[j].a && p[i].b >= p[j].b){ // 有等于号'='!
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int ans = dp[0];
for (int i = 0; i < n; i++){
ans = max(ans, dp[i]);
}
// printf("%d\n", ans);
cout << ans << endl;
}
return 0;
}