写的代码有点垃圾,改天优化一下。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1001;
int dp[N];
int front[N];
int p[N];
typedef struct
{
int weight;
int speed;
int num;
} mice;
mice mouse[N];
bool cmp(mice lhs, mice rhs)
{
return lhs.weight < rhs.weight; //体重递增排序
}
int main()
{
int t = 0;
while(cin >> mouse[t].weight >> mouse[t].speed)
{
mouse[t].num = t + 1;
t++;
}
sort(mouse, mouse + t, cmp);
memset(dp, 0, sizeof(dp));
memset(front, 0, sizeof(front));
//最递减子序列
for(int i = 0; i < t; i++)
{
dp[i] = 1;
front[i] = -1;
for(int j = i - 1; j >= 0; j--)
{
if(mouse[j].speed > mouse[i].speed && dp[j] + 1 > dp[i] && mouse[i].weight > mouse[j].weight)
{
dp[i] = dp[j] + 1;
front[i] = j;
}
}
}
int max = 0;
for(int i = 0; i < t; i++)
if(dp[i] > dp[max])
max = i;
cout << dp[max] << endl;
int k = 0;
while(front[max] != -1)
{
p[k++] = mouse[max].num;
max = front[max];
}
p[k++] = mouse[max].num;
while(k--)
cout << p[k] << endl;
return 0;
}
写了初始版本后,偷懒参考了一篇代码,该代码提交能够AC,但是我跟他一样写的(只是他qsort,我用的sort),导致了我输出的结果一直很怪异。郁闷了半天。
通过输出比较,我发现qsort的只是将重量排序,而sort将速度也排序,导致的结果不同。而根本原因是,该代码只是碰巧可以通过,如果题目换个测试例子,将重量也递减,是不可能通过的。所以正确的做法应该是要判断重量是否相同,相同则不考虑。 该代码没有考虑重量,居然AC,使我一直以为不用判断重量,ac不了。一字一句地对照了半天。
非吐槽不可了。
#include <stdio.h>
#include <stdlib.h>
struct No
{
int w;
int s;
int num;
}a[1005];
int cmp(const void *c,const void *d)
{
return *(int *)c-*(int *)d;
}
int main ()
{
int n=0,i,j,k,max;
int m[1005],pre[1005],p[1005];
while (scanf("%d %d",&a[n].w,&a[n].s)!=EOF)
{
a[n].num=n+1;
n++;
}
qsort(a,n,sizeof(a[0]),cmp);
for (i=0;i<n;i++)
{
m[i]=1;pre[i]=-1;
for (j=i-1;j>=0;j--)
{
if (a[j].s>a[i].s && m[j]+1>m[i])
{
m[i]=m[j]+1;
pre[i]=j;
}
}
}
for (max=0,i=0;i<n;i++)
if (m[i]>m[max]) max=i;
printf("%d\n",m[max]);
k=0;
while (pre[max]!=-1)
{
p[k++]=a[max].num;
max=pre[max];
}
p[k++]=a[max].num;
while (k--)
printf ("%d\n",p[k]);
return 0;
}