FatMouse's Speed HDU - 1160 最长上升序列, 线性DP

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
    int w, s;
    int index;  //储存标号
} mouse[1005]; //小鼠的信息
//先体重,后速度
bool cmp(node a,node b)
{
    if(a.w==b.w)  
        return a.s<b.s;
    return a.w<b.w;
}
int main()
{
    int dp[1005],load[1005],ans[1005];
    int i, maxl,maxi,n,temp,x;
    i=1;
    while(scanf("%d%d",&mouse[i].w,&mouse[i].s)!= EOF)
    {
        mouse[i].index=i;
        dp[i]=1;
        load[i]=0;
        i++;
    }
    sort(mouse+1,mouse+i,cmp);
    //总数量 
    n=i-1;
    maxl=0;
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<i;j++)
            if(mouse[i].w>mouse[j].w&&mouse[i].s<mouse[j].s&&dp[i]<dp[j]+1)
            {
                //如果i的体重比j的小,而且速度j的大,并且还得j的最长子序列加一要大于目前i的最长子序列
                dp[i] = dp[j] + 1;
                load[i] = j;
            }
        if(dp[i]>maxl)
        {
            //最长序列 
            maxl = dp[i];
            //序列最后一个 
            maxi = i;
        }
    }
    temp=maxi;
    x=0;
    //将最终的结果标号存入数组中
    while(temp!=0)
    {
        ans[x]=temp;
        temp=load[temp];
        x++;
    }
    printf("%d\n", maxl);
    for(int i=maxl-1;i>= 0;i--)//标号存的时候是倒序,所以要给它反过来
        printf("%d\n",mouse[ans[i]].index);
    return 0;
}

 

posted @ 2020-01-28 16:45  晴屿  阅读(165)  评论(0编辑  收藏  举报