HDU1160-LIS&路径记录-J

来源:互联网 发布:工业机器人网络培训 编辑:程序博客网 时间:2024/06/17 01:52

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;}
原创粉丝点击