HDU 1160 最长下降子序列(错误代码也可能通过,误导啊)

来源:互联网 发布:数据录入软件 编辑:程序博客网 时间:2024/06/06 05:53

写的代码有点垃圾,改天优化一下。

#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;}