果枫-国峰

hdu 1160 题意

题意:第1列单调递增,第2列单调递减,满足这两个要求最长的子序列。

 

ac代码:

View Code
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;

struct node{
    int num;//记录输入的顺序
    int weight;
    int rate;
    const bool operator<(struct node &d)const{  //重载小于号,作用:结构体中的元素按weight的升序排列
        return weight<d.weight;
    }
};

struct node str[1009];
int f[1009];//f[]:以第i个结束的最长子序列
stack<struct node>s;

int main(){
    memset(f,0,sizeof(f));
    int n,m;
    int num=0;
    int i,j;
    struct node  temp;

    while(cin>>n>>m){ //输入只有一组数据
        temp.num=num+1;
        temp.weight=n;
        temp.rate=m;
        str[num]=temp;
        num++;
    }

    int max;
    int mm=-1,k;
    sort(str,str+num);

    f[0]=1;
    for(i=1;i<num;i++){        //此程序精华
        max=-1;
        for(j=i-1;j>=0;j--){
            if(str[i].rate<str[j].rate &&str[i].weight>str[j].weight){
                if(max<f[j]){
                    max=f[j];
                }
            }

        }
        if(max==-1)
            f[i]=1;  
        else
            f[i]=max+1;
        if(mm<=f[i]){
            mm=f[i];
            k=i;
        }
    }


    s.push(str[k]);
    j=f[k];
    int l=k;
    for(i=l;i>=0;i--){
        if(f[i]==f[k]-1&&s.top().rate<str[i].rate&&s.top().weight>str[i].weight){
            s.push(str[i]);
            k=i;
        }
    }

    cout<<s.size()<<endl;

    while(!s.empty()){
        cout<<s.top().num<<endl;
        s.pop();
    }


    return 0;
}

 

posted on 2012-09-08 19:59  果枫-国峰  阅读(292)  评论(0编辑  收藏  举报

导航