hdu 1160 FatMouse's Speed

来源:互联网 发布:淘宝平邮无需物流 编辑:程序博客网 时间:2024/05/18 01:16

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

代码:

#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;}


0 0