题目分析:用一个结构体来存储,按w升序排列,查找递减序列用N^2算法...dp 数组用结构体,方便记录递减序列的上一个点
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int no,w,s;
}arr[2000];
struct node1{
int v,pre;
}dp[2000];
int path[2000];
int cmp(node a,node b)
{
return a.w<b.w;//在VC6.0中,错的....a.w-b.w;
}
int main()
{
int c=1,n,i,j;
while(scanf("%d %d",&arr[c].w,&arr[c].s)!=EOF)
{
arr[c].no=c;
c++;
}
n=c-1;
sort(arr+1,arr+1+n,cmp);
/* for(i=1;i<=n;i++)
printf("%d**** %d\n",arr[i].w,arr[i].s);*/
dp[1].v=1;
dp[1].pre=0;
int ans=0,temp=0;
for(i=2;i<=n;i++)
{
ans=0;
temp=0;
for(j=1;j<i;j++)
if(arr[i].w!=arr[j].w && arr[i].s<arr[j].s && dp[j].v>ans)
{
ans=dp[j].v;
temp=j;
}
dp[i].v=ans+1;//又忘了+1
dp[i].pre=temp;
}
ans=0;
for(i=1;i<=n;i++)
if(dp[i].v>ans)
{
ans=dp[i].v;
temp=i;
}
printf("%d\n",ans);
//输出路径
c=1;
while(dp[temp].pre!=0)
{
//printf("%d\n",temp);
path[c++]=temp;
temp=dp[temp].pre;
}
//printf("%d\n",temp);
path[c]=temp;
for(i=c;i>=1;i--)
printf("%d\n",arr[path[i]].no);
//system("pause");
return 0;
}