帮可爱的木棍排排序~(≧▽≦)/~啦啦啦
给你n对数,代表每个木棍的长度和质量,要求找出k段序列,使得每一段序列中,长度不下降,质量不下降,请输出最小k值
O(∩_∩)O哈!
很明显,要求最长上升子序列
是吗? ?_?
我们带着疑问来分析一下
O(∩_∩)O好的
首先把长度按照单调递增排一排序,然后我们只需要求出wei的k值就好啦
(^o^)/YES!
然后就要求wei的最小不下降序列数,感觉如果直接求复杂度很高>o<
那么换个思路
我们来求最长下降子序列,它的长度就是最小k值
(这是显然的,你自己YY吧~(≧▽≦)/~啦啦啦)
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=5000+10;
int cas,n,f[maxn];
struct stick{
int len,wei;
}s[maxn];
bool cmp(stick a,stick b){
return a.len==b.len ? a.wei<b.wei : a.len<b.len;
}
int main(){
cin>>cas;
while(cas--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&s[i].len,&s[i].wei);
sort(s+1,s+n+1,cmp);//把长按照升序排列,然后在重量所组成的序列中找上升子序列
memset(f,0,sizeof(f));
s[0].wei=0x3f3f3f3f;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
if(s[j].wei>s[i].wei)
f[i]=max(f[i],f[j]+1);
int ans=1;
for(int i=1;i<=n;i++)
ans=max(ans,f[i]);
cout<<ans<<endl;
}
return 0;
}
by >o< neighthorn