HDU 1160
题意为:给出老鼠的体重和速度 。求最长的序列,使得体重递增,速度递减
由题意可知,是求最长上升子序列,并且需要对其进行路程纪录
AC代码为:
#include<iostream>
#include<cstdio>
#include <stdio.h>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#include <set>
#define ll long long
using namespace std;
struct A
{
int s,w;
int cnt;//小鼠的编号
}a[2020];
int pre[2020],dp[2020];//pre为纪录小鼠的路程。
int cmp(A a,A b)//排序比较函数
{
if(a.w==b.w)
{
return a.s>b.s;
}
return a.w<b.w;
}
int root(int ans)//输出编号
{
if(pre[ans]!=ans)
root(pre[ans]);
cout<<a[ans].cnt<<endl;
}
int main()
{
int n=0;
while (scanf("%d%d",&a[n].w,&a[n].s)!=EOF)
{
a[n].cnt=n+1;
n++;
}
sort(a,a+n,cmp);//排序
int ans=0,p;
for(int i=0;i<n;i++)//寻找最长上升子序列
{
pre[i]=i;
dp[i]=1;
for(int j=0;j<i;j++)
{
if(a[j].w<a[i].w&&a[j].s>a[i].s)
{
if(dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
pre[i]=j;
}
}
}
ans=max(ans,dp[i]);
}
for(int i=0;i<n;i++)
{
if(ans==dp[i])
{
p=i;
break;
}
}
cout<<ans<<endl;
root(p);
return 0;
}