这个题给的标签是dp,然而有很简单的贪心策略可以解决,类似导弹拦截问题。
首先结构体排序长度,然后求其最长不上升子序列的个数就可以了。遍历整个数组,如果没被访问过答案就+1,设置序列最小值为当前的宽度,然后从i+1到n循环,如果比它小并且没被访问过,就给其打上标记,并将最小值下放,最后输出答案即可。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
int n;
struct stick
{
int l;
int w;
}a[5010];
int vis[5010]={0};
bool cmp(const stick &a,const stick &b)
{
if(a.l==b.l) return a.w>b.w;
return a.l>b.l;
}
int ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].l>>a[i].w;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
int tmp=i;
int ww;
if(vis[tmp]==0)
{
ans++;
ww=a[tmp].w;
vis[tmp]=1;
for(int j=tmp+1;j<=n;j++)
{
if(a[j].w<=ww&&vis[j]==0)
{
vis[j]=1;
ww=a[j].w;
}
}
}
}
cout<<ans<<endl;
return 0;
}