思路分析:
实例说明
将一端排序,并且对应的另一端的城市也按照这个顺序排序,一定不会产生冲突。
例如:
北岸:
2 3 4 6 8 12 17
南岸:
2 4 9 10 15 17 22
北岸 -> 南岸:
2 -> 4
3 -> 10
4 -> 22
……
对应的南岸的序列就是 4 10 22 2 9 15 17
求LIS: 4 9 15 17
长度是4
这样就是求LIS
代码:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 5010;
typedef pair<int , int >PII;
vector<PII> c;
int f[N];
int main()
{
int n ; cin >> n;
for(int i = 0; i < n; ++i)
{
int s, north; cin >> s >> north;
c.push_back({s, north});
}
sort(c.begin(), c.end());
//for(int i = 0; i < c.size(); ++i)cout << c[i].second <<" ";
int res = 0;
for(int i = 0; i < c.size(); ++i)
{
f[i] = 1;
for(int j = 0; j < i; ++j)
if(c[j].second < c[i].second)f[i] = max(f[i], f[j] + 1);
res = max(f[i], res);
}
cout << res <<endl;
return 0;
}