首页 > 代码库 > hdu 1160 FatMouse's Speed

hdu 1160 FatMouse's Speed

题目:寻找最长上升自序列。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
    int w,s;                //重量,速度
    int num;             //编号
    int t;                   //用来记录当前编号前面的最优解的编号
}root[1010];
bool cmp(node a,node b)     //先按照重量最小排,然后按照速度最大排
{
   if(a.w!=b.w)
    return a.w<b.w;
    return a.s>b.s;
}

int main()
{
    int x,y,i=0,j;
    int dp[1010];                     //dp数组用来记录当前编号对应的最优解
    memset(root,0,sizeof(root));
    while(cin>>x>>y)
    {
       dp[i]=1;
       root[i].num=i+1;
       root[i].w=x;root[i++].s=y;
    }
    int n=i,ans=0;
    sort(root,root+n,cmp);
    for(i=0;i<n;i++)
        cout<<root[i].num<<":"<<root[i].w<<" "<<root[i].s<<endl;
    for(i=0;i<n;i++)
    {
        int p=-1;                                //记录当前编号前面的最优解的编号
        for(j=0;j<i;j++)
        if(root[i].w>root[j].w&&root[i].s<root[j].s)
        {
            if(dp[i]<dp[j]+1)
             dp[i]=dp[j]+1,p=j;
        }
        if(p>=0) root[i].t=p;
        if(dp[ans]<dp[i]) ans=i;
    }
     cout<<dp[ans]<<endl;
     int t=dp[ans],p=ans;
     n=dp[ans];
     while(t)                                     //类似递归来寻找对应的序列
     {
         dp[t]=root[p].num;         //节省空间,请原谅我的节俭^ ^
         p=root[p].t;
         t--;
     }
    for(i=1;i<=n;i++)
        cout<<dp[i]<<endl;
    return 0;
}