题意:给出一组老鼠的大小和速度,找出最大的一组老鼠,使得大小在严格增大的同时速度严格减小。
设dp【i】为第i只老鼠在第i组时,组内的老鼠数量最多,那么求一发最大下降子序列即可
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <iomanip>
///cout << fixed << setprecision(13) << (double) x << endl;
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define ls rt << 1
#define rs rt << 1 | 1
#define pi acos(-1.0)
#define eps 1e-8
#define asd puts("sdfsdfsdfsdfsdfsdf");
#define Mp(a, b) make_pair(a, b)
typedef long long ll;
//typedef __int64 LL;
const int inf = 0x3f3f3f3f;
const int N = 1010;
int dp[N], pre[N];
struct node{
int spd, sz;
int id;
}a[N];
bool cmp( node q, node w )
{
if( q.sz != w.sz )
return q.sz < w.sz;
else {
if( q.spd != w.spd )
return q.spd > w.spd;
}
}
int main()
{
//freopen( "date.in", "r", stdin );
int n = 1;
while( ~scanf("%d%d", &a[n].sz, &a[n].spd ) )
a[n].id = n, ++n;
n--;
for( int i = 1; i <= n; ++i )
dp[i] = 1;
memset( pre, -1, sizeof( pre ) );
sort( a+1, a+1+n, cmp );
for( int i = 1; i <= n; ++i ) {
for( int j = 1; j < i; ++j ) {
if( a[i].sz > a[j].sz && a[i].spd < a[j].spd ) {
if( dp[i] < dp[j]+1 ) {
dp[i] = dp[j] + 1;
pre[i] = j;
}
}
}
}
int ans = 0, pos;
for( int i = 1; i <= n; ++i ) {
if( ans < dp[i] ) {
ans = dp[i];
pos = i;
}
}
printf("%d\n", ans);
stack <int> s;
while( pos != -1 ) {
s.push( pos );
pos = pre[pos];
}
while( !s.empty() ) {
printf("%d\n", a[s.top()].id);
s.pop();
}
return 0;
}