算法提高之友好城市
-
核心思想:线性dp
-
- 将所有路按上坐标从小到大排序后 道路的数量就是下坐标的最长的上升子序列
- 因为上坐标和下坐标同时增加 一定不会交叉
-
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef pair<int, int> PII; const int N = 5010; #define x first #define y second int f[N]; int n; PII p[N]; //对组存 first存上坐标 int main() { cin>>n; for(int i=0;i<n;i++) cin>>p[i].x>>p[i].y; sort(p,p+n); for(int i=0;i<n;i++) //对下坐标 求最长上升子序列 { f[i] = 1; for(int j=0;j<i;j++) if(p[i].y > p[j].y) f[i] = max(f[i],f[j] + 1); } int res=0; for(int i=0;i<n;i++) { res = max(res,f[i]); } cout<<res<<endl; }