题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160
题目大意:
n只老鼠编号1-n,给出每一只的重量w和速度s,求最长的一个序列满足重量严格递增,速度严格递减(顺序和输入无关,老鼠的顺序可以自己定,有Special Judge),输出这样的老鼠的编号顺序。
思路:
先按照重量从小到大排序,那么就可以求速度的最长递减序列,但是同时还要满足重量严格递增,速度严格递减,这个很好求,题目要求输出取的老鼠的顺序,那么就需要一个数组now记录每一个dp的状态由哪个状态转移而来,再dfs回去就好了,和迷宫搜索打印路径一样。
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Point
{
int w,s,num;
}C[1005];
int now[1005];
bool cmp(Point a,Point b){
if(a.w==b.w){
return a.s>b.s;
}
return a.w<b.w;
}
void dfs(int x)
{
if(now[x]!=-1){
dfs(now[x]);
}
if(now[x]!=-1)cout<<now[x]+1<<endl;
}
int main()
{
int l=0;
while(scanf("%d %d",&C[l].w,&C[l].s)!=EOF){
C[l].num=l; now[l]=-1;l++;
}
sort(C,C+l,cmp);
int dp[1005];
for(int i=0;i<l;i++){
dp[i]=1;
for(int j=0;j<i;j++){
if(C[j].s>C[i].s&&C[j].w<C[i].w&&dp[i]<dp[j]+1)
{dp[i]=dp[j]+1;
now[C[i].num]=C[j].num;
}
}
}
int ans=0,index=-1;
for(int i=0;i<l;i++){
if(dp[i]>ans){
ans=dp[i];index=i;
}
}
cout<<ans<<endl;
dfs(C[index].num);cout<<C[index].num+1<<endl;
}