HDU 1160 FatMouse's Speed

来源:互联网 发布:java swing 做成exe 编辑:程序博客网 时间:2024/04/27 20:05

题目链接: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];        }    }}


0 0
原创粉丝点击