感觉很能让人理解LIS的一种方法,记录路径输出来看看。直接贴AC代码吧,有很多注释,都是输出中间结果以助理解的。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct mice
{
int id;
int weight;
int speed;
}m[1005];
int dp[1005];
int pre[1005];
bool cmp(struct mice a,struct mice b)
{
if(a.speed==b.speed)
{
return a.weight<b.weight;
}
else
return a.speed>b.speed;
}
int main()
{
int i=1;
//freopen("X.txt","r",stdin);
while(scanf("%d%d",&m[i].weight,&m[i].speed)!=EOF)
{
m[i].id=i;
i++;
}
/*for(i=1;i<=9;i++)
{
scanf("%d%d",&m[i].weight,&m[i].speed);
m[i].id=i;
}*/
n=i-1;
sort(m+1,m+1+n,cmp);
/*for(int i=1;i<=9;i++)
cout<<"i="<<i<<" id="<<m[i].id<<" weight="<<m[i].weight<<" speed="<<m[i].speed<<endl;*/
memset(pre,0,sizeof(pre));
dp[1]=1;
int ans=dp[1];
int pos=-1;
for(int i=2;i<=n;i++)
{
dp[i]=1;
//cout<<"i="<<i<<endl;
for(int j=1;j<i;j++)
{
if(m[i].weight>m[j].weight&&m[i].speed<m[j].speed)
{
if(dp[j]+1>dp[i])
{
dp[i]=dp[j]+1;
pre[i]=j;
//cout<<" pre="<<j<<endl;
}
//dp[i]=max(dp[i],dp[j]+1);
}
}
if(dp[i]>ans)
{
ans=dp[i];
pos=i;
}
//ans=max(ans,dp[i]);
}
//cout<<"pos="<<pos<<endl;
printf("%d\n",ans);
int tmp[1005];
i=1;
while(pos!=0)
{
tmp[i++]=m[pos].id;
//cout<<"pos="<<pos<<" m[pos].id="<<m[pos].id<<endl;
pos=pre[pos];
}
for(int i=ans;i>=1;i--)
printf("%d\n",tmp[i]);
return 0;
}