https://vjudge.net/contest/170788#problem/J
给定一组老鼠的重量和速度,要求找到最大的一组。
重量上升,速度却在下降。
我的思路,先给速度降序,在重量建立一个数组,求LIS。并且记录路径。
记录路径我直接用的链表,,事实证明这样有点麻烦
qwq
#include<bits/stdc++.h>
using namespace std;
const int maxn=2000;
vector<pair<pair<int,int>,int> >v;
bool cmp2(pair<pair<int,int>,int>a,pair<pair<int,int>,int>b){
return a.first.second>b.first.second;
}
struct Node
{ int num;
int bh;
}a[maxn];
int main()
{ v.clear();
int a1,b;
int t=1;
while(~scanf("%d%d",&a1,&b)){
v.push_back(make_pair(make_pair(a1,b),t++));
}
sort(v.begin(),v.end(),cmp2);
t=0;
for(int i=0;i<v.size();i++){
a[t].num=v[i].first.first;
a[t++].bh=v[i].second;
}
vector<int>q;
/*for(int i=0;i<t;i++){
int u=lower_bound(q.begin(),q.end(),a[i].num)-q.begin();
if(u==q.size()){
q.push_back(a[i].num);
bb.push_back(a[i].bh);
}
else{
q[u]=a[i].num;
bb[u]=a[i].bh;
}
这样可以得到准确的长度,但是无法得到准确的序列。
比方说 8 9 10 1 11,那么得到的就是 1 9 10 11,是不对的。
}*/
list<int>bb[maxn];
list<int>ans;
int dp[maxn];
for(int i=0;i<t;i++) {dp[i]=1;
bb[i].push_back(a[i].bh);
}
int max1=-1;
int max2=0;
for(int i=0;i<t;i++){
ans.clear();
for(int j=0;j<i;j++){
if(a[i].num>a[j].num){
if(dp[i]<(dp[j]+1))
{dp[i]=dp[j]+1;//增加一个
ans.clear();
list<int>::iterator it;
for(it=bb[j].begin();it!=bb[j].end();it++)
ans.push_back(*it);
}
}
}
list<int>::iterator it;
if(!ans.empty())
for(it=ans.begin();it!=ans.end();it++)
bb[i].push_back(*it);
if(max1<dp[i]){
max1=dp[i];
max2=i;
}
}
list<int>::iterator i;
int nc[maxn];
int sum=0;
cout<<bb[max2].size()<<endl;
for(i=bb[max2].begin();i!=bb[max2].end();i++)
nc[sum++]=*i;
reverse(nc,nc+sum);
for(int i=0;i<sum;i++)
printf("%d\n",nc[i]);
return 0;
}