简单DP,最长递减子序列,要保存路径
矬代码献上:
#include <stdio.h>
#include <stdlib.h>
#define N 1005
struct Mouse
{
int w,s;
int id,prev;
}mice[N];
int dp[N];
int cmp(const void *a, const void *b)
{
struct Mouse *c = (Mouse *) a;
struct Mouse *d = (Mouse *) b;
if(c->w!=d->w) return c->w - d->w;//大于0则交换,即c->x大时交换,即从小到大
else return d->s - c->s;
}
int main()
{
int num = 1;
while(scanf("%d%d",&mice[num].w,&mice[num].s)!=EOF)
{
dp[num]=1;
mice[num].id = num;
mice[num].prev = -1;
num++;
}
num--;
qsort(mice+1,num,sizeof(struct Mouse),cmp);
/*
for(int i=1; i<=num; i++)
printf("%d,%d\n",mice[i].w,mice[i].s);
*/
int max = 1, max_id = -1;
for(int i=2; i<=num; i++)
{
for(int j=1; j<i; j++)
{
if(mice[i].s<mice[j].s && mice[i].w!=mice[j].w && dp[i]<dp[j]+1)//注意是w、s分别严格递增、递减
{
dp[i] = dp[j] + 1;
mice[i].prev = j;
}
}
if(dp[i] > max)
{
max = dp[i];
max_id = i;
}
}
printf("%d\n",max);
for(int i=0; i<max; i++)
{
dp[i] = mice[max_id].id;
max_id = mice[max_id].prev;
}
for(int i=max-1; i>=0; i--)
printf("%d\n",dp[i]);
return 0;
}