HDU -1160 FatMouse's Speed (类最长上升子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160

题目大意:

       n只老鼠编号1-n,给出每一只的重量w和速度s,求最长的一个序列满足重量严格递增,速度严格递减(顺序和输入无关,老鼠的顺序可以自己定,有Special Judge),输出这样的老鼠的编号顺序。

思路:

        先按照重量从小到大排序,那么就可以求速度的最长递减序列,但是同时还要满足重量严格递增,速度严格递减,这个很好求,题目要求输出取的老鼠的顺序,那么就需要一个数组now记录每一个dp的状态由哪个状态转移而来,再dfs回去就好了,和迷宫搜索打印路径一样。


#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Point
{
    int w,s,num;
}C[1005];
int now[1005];
bool cmp(Point a,Point b){
    if(a.w==b.w){
        return a.s>b.s;
    }
    return a.w<b.w;
}
void dfs(int x)
{
    if(now[x]!=-1){
        dfs(now[x]);
    }
    if(now[x]!=-1)cout<<now[x]+1<<endl;
}
int main()
{
    int l=0;
    while(scanf("%d %d",&C[l].w,&C[l].s)!=EOF){
       C[l].num=l; now[l]=-1;l++;
    }
    sort(C,C+l,cmp);

    int dp[1005];
    for(int i=0;i<l;i++){
        dp[i]=1;
        for(int j=0;j<i;j++){
            if(C[j].s>C[i].s&&C[j].w<C[i].w&&dp[i]<dp[j]+1)
                {dp[i]=dp[j]+1;
                now[C[i].num]=C[j].num;
                }
        }
    }
    int ans=0,index=-1;
    for(int i=0;i<l;i++){
        if(dp[i]>ans){
            ans=dp[i];index=i;
        }
    }
    cout<<ans<<endl;
    dfs(C[index].num);cout<<C[index].num+1<<endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值