贪心+动态规划最长上升子序列模型
1.对一边的点排序
2.对另外一边求最长上升子序列
对一边进行排序后,因为不能让桥相交,所以我们选定了另外一边桥后,所以不能选择前面的桥,即最长上升子序列,是递增的。
$ 时间复杂度O(N^2)$
参考文献
算法提高课
AC代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PAIR;
const int N = 5e3 + 10;
PAIR city[N];
int f[N];
int n;
int main(){
//读入
cin >> n;
for (int i = 0 ; i < n ; i ++){
int a , b ;
cin >> a >> b;
city[i] = {a,b};
}
//排序
sort(city, city + n);
//对另外一边求最长上升子序列
int res = 0;
for (int i = 0 ; i < n ; i ++){
f[i] = 1;
for (int j = 0 ; j < i ; j ++){
int a = city[i].second, b = city[j].second;
if (b < a) f[i] = max(f[i], f[j] + 1);
}
res = max(res, f[i]);
}
cout << res;
return 0;
}