我是想写写dp来着……所以我查了标签是dp的题。
在做了三道蓝题之后,蒟蒻的我想做一道简单点的题恢复自信qwq……
于是,这道题,我怎么也下过不出转移方程……但是我忽然发现,这道题根本就不用dp!贪心 + 排序即可!
因为我们一定是要时间 < n 的,所以我们就算最后什么也没找到,也不会比 n 更差,那么我们先按照其中一个值排序,如果想要有比n更好的解,就一定要按照这个顺序去找!
那么就等价于,我们就可以只看其中一个值就行!
owo
于是这道题就变成了排序,我们想要最少的下降序列,那么就是求最长的上升(严格上升)序列!
不懂题解里的大神都是怎么想的qwq……
下面贴代码;
#include<cstdio> #include<algorithm> #include<iostream> using namespace std; #define maxn 5500 struct node { int l,r; } a[maxn]; int n; bool cmp(node x,node y) { return x.l>y.l; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r); sort(a+1,a+n+1,cmp); int cnt=0; int b[maxn],c[maxn]; for(int i=1;i<=n;i++) b[i]=a[i].r; int len=1; c[1]=b[1]; for(int i=2;i<=n;i++) { if(b[i]>c[len]) { c[++len]=b[i]; continue; } int p=lower_bound(c+1,c+1+len,b[i])-c; c[p]=b[i]; } printf("%d",len); return 0; }