最长上升子序列加输出路径emmm
不过那个排序好像没什么大用QAQ
#include<string.h>
#include<stdio.h>
#include<algorithm>
int dp[1005];
int cun[1005];
using namespace std;
struct node{
int num,w,s,pre;
}a[1005];
int cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
int i=0,ans=0,sum,wei,coun=0;//最后输出答案全部加一。
while(scanf("%d%d",&a[i].w,&a[i].s)!=EOF)
{
a[i].num=i;
i++;
}
memset(dp,0,sizeof(dp));
sum=i;//代表的是个数
sort(a,a+sum,cmp);
for(int i=0;i<sum;i++)
a[i].pre=i;
dp[0]=1;
for(i=0;i<sum;i++)
{
for(int j=0;j<i;j++)
{
if(a[i].s<a[j].s && a[i].w>a[j].w)
{
if(dp[j]+1>dp[i])
{
dp[i]=dp[j]+1;
a[i].pre=j;
}
}
else if (dp[i]==0)
{
dp[i]=1;
a[i].pre=i;
}
}
if(dp[i]>ans)
{
ans=dp[i];
wei=i;
}
}
i=wei;
//printf("%d\n",wei);
while(a[i].pre!=i)
{
//printf("%d\n",a[i].num);
//printf("%d%d\n",a[i].w,a[i].s);
cun[coun++]=a[i].num+1;
i=a[i].pre;
}
//printf("%d%d\n",a[i].w,a[i].s);
cun[coun++]=a[i].num+1;
printf("%d\n",coun);
for(int i=coun-1;i>=0;i--)
printf("%d\n",cun[i]);
return 0;
}