最长XX子序列,预处理需要排序,我的是按体重升序排序的,相同的降序处理。
寻找具体老鼠是从后往前推,如果记录的以ind 结尾的老鼠的最长XX序列 == 下一个结尾的老鼠的个数 - 1,那么说明后面那个点是经过这个点更新的(多种情况,任一均可)。
当然这个老鼠也要符合体重,速度的性质。
发现这题在ZOJ我以前过了= =。。当时记录的是前一个点的下标。。。
#include <queue>
#include <stack>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#define MID(x,y) ( ( x + y ) >> 1 )
#define L(x) ( x << 1 )
#define R(x) ( x << 1 | 1 )
#define BUG puts("here!!!")
using namespace std;
const int MAX = 1010;
struct NODE{ int w,s,ind;};
NODE a[MAX];
int len[MAX];
stack<int> s;
bool cmp(NODE a,NODE b)
{
if( a.w == b.w )
return a.s > b.s;
return a.w < b.w;
}
int main()
{
int n = 0;
while( ~scanf("%d%d",&a[n].w, &a[n].s) )
{
a[n].ind = n + 1;
n++;
}
sort(a, a+n, cmp);
memset(len, 0, sizeof(len));
int sum = 0;
for(int i=0; i<n; i++)
{
int t = 0;
for(int k=0; k<i; k++)
if( a[i].w > a[k].w && a[i].s < a[k].s )
t = max(t, len[k]);
len[i] = t + 1;
}
int ind = max_element(len,len+n) - len;
s.push(a[ind].ind);
int t = ind;
for(int i=ind-1; i>=0; i--)
if( a[i].w < a[t].w && a[i].s > a[t].s && len[t] == len[i] + 1 )
{
s.push(a[i].ind);
t = i;
}
printf("%d\n",len[ind]);
while( !s.empty() )
{
printf("%d\n",s.top());
s.pop();
}
return 0;
}