次题是将elephant的体重按升续排列,然后求IQ的最长下降子序列。次题的难点在于如何记录id,并且输出。。。
// File Name: UVa10131.cpp
// Author: Toy
// Created Time: 2013年04月08日 星期一 11时30分15秒
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cctype>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <iomanip>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <utility>
#include <bitset>
#define L(x) x << 1
#define R(x) x << 1 | 1
using namespace std;
struct Ele {
int we, iq, id;
}ele[1005];
bool cmp ( Ele a, Ele b ) {
if ( a.we == b.we ) return a.iq < b.iq;
else return a.we < b.we;
}
void output ( int p[], int ipo ) {
if ( ipo == 0 ) return;
output ( p, p[ipo] );
printf ( "%d\n", ele[ipo].id );
}
int opt[1005], path[1005];
int main ( ) {
int tmp = 1;
while ( scanf ( "%d%d", &ele[tmp].we, &ele[tmp].iq ) != EOF )
ele[tmp].id = tmp++;
memset ( path, 0 ,sizeof ( path ) );
memset ( opt, 0, sizeof ( opt ) );
sort ( ele + 1, ele + tmp, cmp );
//for ( int i = 1; i < tmp; ++i )
//printf ( "%d %d\n", ele[i].we, ele[i].iq );
ele[0].iq = 10000;
for ( int i = 1; i < tmp; ++i )
for ( int j = i - 1; j >= 0; --j )
if ( ele[j].iq > ele[i].iq && opt[j] + 1 > opt[i] ) opt[i] = opt[j] + 1, path[i] = j;
int ii, ans = 0;
for ( int i = 1; i < tmp; ++i )
if ( opt[i] > ans ) ans = opt[i], ii = i;
printf ( "%d\n", ans );
output ( path, ii );
return 0;
}