版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QingCoffe/article/details/85108400
思路模拟,利用l排序,先确定l小的在前,如果相等再排序w,由于是基本有序的状态,所以只要比较后面的是否w大于前面的即可
利用visit记录访问,从第一个开始访问,将后面能串起来的都串起来(符合l'>l w'>w都标记已访问),直到所有都被访问,这时候记录串了几次就可。
#include<iostream>
# include<algorithm>
using namespace std;
struct nn {
int l, w;
}a[5000];//最大5000
bool cmp(nn a, nn b) {
return a.l == b.l ? a.w < b.w : a.l < b.l;
}
bool visit[5000];
int main(void) {
int T, n;
cin >> T;
while (T--) {
cin >> n;//先l 后 w
memset(visit, 0, sizeof(bool)*n);//初始化dp
for (int i = 0; i < n; i++) {
cin >> a[i].l >> a[i].w;
}//录入数据
sort(a, a + n, cmp);//排序
int res=0;
for (int i = 0; i < n; i++) {
if (!visit[i]) {
visit[i] = 1;
res++;
int cur = i;
for (int k = i + 1; k < n; k++) {
if (!visit[k]&&a[k].w >= a[cur].w) {//(1,4), (3,5), (4,9) (2,1), (5,2).
visit[k] = 1; cur = k;
}
}
}
}
cout << res << endl;
}
system("pause");
return 0;
}
LIS 动态规划做法:
#include<iostream>
# include<algorithm>
using namespace std;
struct nn {
int l, w;
}a[5000];//最大5000
bool cmp_( nn a, nn b) {
return a.l == b.l ? a.w < b.w : a.l < b.l;
}
int dp[5000];
int main(void) {
int T,n;
cin >> T;
while (T--) {
cin >> n;//先l 后 w
memset(dp, 0, sizeof(int)*n);//初始化dp
for (int i = 0; i < n; i++) {
cin >> a[i].l >> a[i].w;
dp[i] = 1;
}//录入数据
sort(a, a + n,cmp_);//排序
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++)
if (a[i].w < a[j].w&&dp[i] < dp[j]+1) {
dp[i] = dp[j] + 1;
}
}
cout << *max_element(dp, dp + n)<<endl;
}
system("pause");
return 0;
}