uva 10131 大象。

来源:互联网 发布:统计与自然语言java 编辑:程序博客网 时间:2024/04/25 13:41

就是一个最长上升子序列而已。

状态转移的时候注意一下必须是严格递增的就好

#include<stdio.h>#include<string.h>#include<stack>#include<vector>#include<algorithm>using namespace std;struct P{    int i;    int w;    int s;    P()    {        i=-1;        s=0;    }    P(int a,int b,int c)    {        i=a;w=b;s=c;    }    bool operator <(const P &o)const    {        return w<o.w;    }};P w[10002];vector<P> ele;int res[2000];int dp[2000];int main(){    int tw,ts;    for(int i=0;i<2000;i++)        res[i]=i;    int index=1;    while(scanf("%d%d",&tw,&ts)!=EOF&&(tw!=0||ts!=0))    {        P tp(index++,tw,ts);        ele.push_back(tp);    }    sort(ele.begin(),ele.end());    memset(dp,0,sizeof(dp));    for(int i=0;i<ele.size();i++)        dp[i]=1;    int max_=-1;    int max_i=0;    for(int i=1;i<ele.size();i++)    {        for(int j=0;j<i;j++)        {            if(ele[i].s<ele[j].s&&ele[i].w!=ele[j].w&&dp[i]<dp[j]+1)            {                res[i]=j;                dp[i]=dp[j]+1;            }        }    }    for(int i=0;i<ele.size();i++)    {        if(max_==-1||max_<dp[i])        {            max_=dp[i];            max_i=i;        }    }    printf("%d\n",dp[max_i]);    stack<int> S;    while(res[max_i]!=max_i)    {        S.push(ele[max_i].i);        max_i=res[max_i];    }    S.push(ele[max_i].i);    while(!S.empty())    {        printf("%d\n",S.top());        S.pop();    }}


原创粉丝点击