zoj 1108 FatMouse's Speed(DP)

最长下降子序列。关键是还要输出构成这个子序列的那些元素。我快哭了,做了好久!

 

无奈地用了结构体。纠结!需要二级排序。

 

昨晚样例终于能过了 = =。。还是WAWAWA。。。郁闷啊郁闷。。。

 

看了党的,发现我想得复杂了 = =。。。我还弄了个数组存到第i个元素构成子序列的最小元素。其实没必要的。因为ind数组中存的已经有下标了。。。 = =我发现不能用index这个当做变量名。。。

 

还有 这个体重是严格上升,速度是严格下降的 = = 这点也错了不少。。。

 

对了 还有一点。应该j是以j为结束点的,即mice[j].s在它自己的最长下降子序列是最小的。恩。这点有点迷糊。

 

DP啊,DP,好强大呢!加油呀!

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <memory.h> #include <limits.h> #include <stack> #define N 1010 using namespace std; typedef struct { int w,s,num; }MICE; MICE mice[N]; stack<int> S; int cmp(const void *a,const void *b) { MICE *x = (MICE*)a; MICE *y = (MICE*)b; if( x->w == y->w ) return -y->s + x->s; else return x->w - y->w; } int ind[N]; int main(void) { int n=0,len[N]; while( cin >> mice[n].w >> mice[n].s ) { mice[n].num = n; n++; } memset(ind,0,sizeof(ind)); memset(len,0,sizeof(len)); qsort(mice,n,sizeof(MICE),cmp); len[0] = 1; for(int i=1; i<n; i++) { int sum = 0,temp; for(int j=0; j<i; j++) if( len[j] > sum && mice[i].w > mice[j].w && mice[i].s < mice[j].s ) { temp = j; sum = len[j]; } if( sum != 0 ) ind[i] = temp; else ind[i] = 0; sum++; len[i] = sum; } int max = 0,tempi; for(int i=0; i<n; i++) if( len[i] > max ) max = len[tempi=i]; cout << max << endl; int i = tempi; while( ind[i] != 0 ) { S.push(mice[i].num+1); i = ind[i]; } S.push(mice[i].num+1); while( !S.empty() ) { cout << S.top() << endl; S.pop(); } return 0; }  

你可能感兴趣的:(zoj 1108 FatMouse's Speed(DP))