hdu 1160

题目给出不确定数量的老鼠的体重和速度,求一个最长序列,其中的老鼠体重递增,速度递减。最后输出序列的长度和老鼠的序号。


LIS的变通题,由于要输出序列,所以下标从1开始,并且用pre记录上一个老鼠的位置
参考文章:http://www.voidcn.com/article/p-bcgohktj-bev.html

#include<cstdio>
#include<stack>
#include<algorithm>
#include<cstring>
using namespace std;

struct rat{
    int wei,spe,id;
    void init(int w,int s, int i){
        wei=w,spe=s,id=i;
    }
};

bool cmp(rat a, rat b){
    return a.wei<b.wei;
}

const int maxn = 1005;
rat r[maxn];
int dp[maxn],pre[maxn];

int main(){
    int len=1;
    int w,s;
    while(~scanf("%d %d",&w,&s)){
        r[len].init(w,s,len);
        len++;
    }
    len--;
    sort(r+1,r+1+len,cmp);
    memset(dp,0,sizeof(dp));
    memset(pre,-1,sizeof(pre));
    for(int i=1;i<=len;i++){
        dp[i]=1;
        for(int j=1;j<i;j++){
            if(r[j].wei<r[i].wei&&r[j].spe>r[i].spe&&dp[j]+1>dp[i]){
                pre[i]=j;
                dp[i]=dp[j]+1;
            }
        }
    }
    int ans=max_element(dp+1,dp+1+len)-dp;
    stack<int>out;
    int lo=ans;
    while(lo!=-1){
        out.push(r[lo].id);
        lo=pre[lo];
    }
    printf("%d\n",dp[ans]);
    while(out.empty()==false){
        printf("%d\n",out.top());
        out.pop();
    }
    return 0;
}

猜你喜欢

转载自blog.51cto.com/13688928/2116165