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