【 OJ 】 HDOJ1051 18年12月19日21:14 [ 45 ]

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/QingCoffe/article/details/85108400