【算法分析】
典型的动态规划题目。
-
先按起点大小排序,只要A起点小于B起点且A终点小等于B终点则不冲突;
-
f[i]表示前i个城市最多修几个桥;
-
然后找出最大的f[i]就是答案。
【代码】
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct city{
int a,b;
}c[5005];
bool cmp(city A,city B){
return A.a<B.a;
}
int f[5005];
int main()
{
int n,ans=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>c[i].a>>c[i].b;
f[i]=1;
}
sort(c,c+n,cmp);
for(int i=1;i<n;i++)
for(int j=i-1;j>=0;j--)
if(c[i].b>=c[j].b){
f[i]=max(f[i],f[j]+1);
ans=max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}