HDU 1160 FatMouse's Speed

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160


题意:有n只老鼠,每只老鼠有wei和speed2个属性,要求往队列里赛老鼠,要求wei递增,speed递减,问队列最多只老鼠的方法


思路:感觉也是最长递增子序列的思路,先按wei进行排序,依次递归就可以了,dp[i]表示以老鼠i为队尾的队列长度


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

struct Node
{
    int w,v,pos;
}s[1030];

int dp[1030],pre[1030];

bool cmp(Node p,Node q)
{
    if (p.w!=q.w) return p.w<q.w;
    else return p.v>q.v;
}

int main()
{
    while (scanf("%d%d",&s[1].w,&s[1].v)!=EOF)
    {
        int num=2;
        while (scanf("%d%d",&s[num].w,&s[num].v)!=EOF)
          s[num].pos=num++;

        s[1].pos=1;
        dp[num-1]=1;
        pre[num-1]=num-1;
        sort(s+1,s+num,cmp);
        for (int i=num-2;i>=1;i--)
        {//cout<<s[i].w<<"------"<<s[i].v<<endl;
            dp[i]=1;
            pre[i]=i;
            for (int j=i+1;j<num;j++)
            {


                if (s[i].w<s[j].w && s[i].v>s[j].v)
                {
                    if (dp[i]<dp[j]+1)
                    {
                        dp[i]=dp[j]+1;
                        pre[i]=j;//cout<<s[j].w<<":"<<s[j].v<<":"<<dp[j]<<":"<<j<<endl;
                    }
                }
            }
        }

        int res=0,pos;
        for (int i=1;i<num;i++)
        {
            if (res<dp[i])
            {
                res=dp[i];
                pos=i;
                //cout<<dp[i]<<":"<<i<<endl;
            }
        }
        printf("%d\n",res);

        while (res--)
        {
            printf("%d\n",s[pos].pos);//cout<<":"<<pos<<endl;
            pos=pre[pos];
        }


    }
}


你可能感兴趣的:(dp,ACM,HDU)