HDU1160-LIS&路径记录-J - FatMouse's Speed

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值