kuangbin基础dp HDU - 1160 // 最长上升子序列+记录路径

题意:

输入中每行有两个正整数,分别表示老鼠的体重和速度,范围均在1到10000之间,输入数据最多有1000只老鼠。我们是要在原来的老鼠序列中,找到一个最长的子序列,使得这个子序列中老鼠的体重在严格增加,速度却在严格降低。

思路:

按照体重排序后,对速度跑一个最长上升子序列,dp形式的,方便记录路径,这里的记录路径和链式前向星原理比较像,在dp时记录最后更新这个节点的前一个节点的序号,dp完后从后往前找整个链就可以了。 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
    int fat,speed,i;
    bool operator < (const node &a){
        if(fat==a.fat)return speed>a.speed;
        else return fat<a.fat;
    }
}s[10010];int dp[10010],pre[10010];
//struct node2{
//    int sss,idx;
//}vis[10010];
int main(){
    int a,b;int flag=0;
    while(cin>>s[flag].fat>>s[flag].speed){
        s[flag].i=flag+1;
        flag++;
    }
    sort(s,s+flag);
//    for(int i=0;i<flag;i++){
//        cout<<s[i].fat<<" "<<s[i].speed<<endl;
//    }
    int fff=0,ans=0;
//    memset(pre,-1,sizeof(pre));
    for(int i=1;i<flag;i++){
        dp[i]=1;
        for(int j=0;j<i;j++){
            if(s[i].speed<s[j].speed&&s[i].fat>s[j].fat){
                if(dp[j]+1>dp[i]){
                  dp[i]=dp[j]+1;
                  pre[i]=j;
                }
            }
        }
    }
    int now=0,be;
    for(int i=0;i<flag;i++){
        if(dp[i]>now){
            now=dp[i];
            be=i;
        }
    }
    cout<<dp[be]<<endl;
    int cnt=0;int num[10010];
    for(int i=be;i!=0;i=pre[i])
        num[cnt++]=s[i].i;
    for(int i=cnt-1;i>=0;i--){
        cout<<num[i]<<endl;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值