题意
给n个老鼠的体重和速度,求找出一个最长的序列,此序列体重递增速度递减
思路
按体重递增排序,再求最长递增(此递增表示体重递增速度递减)子序列。
dp[i] = max(dp[j]+1) 0<=j<=i-1
代码
#include <algorithm>
#include <cstring>
#include <iostream>
#define N 1005
#define INF 0x7f7f7f7f
using namespace std;
struct Mouse {
int id;
int w, s;
bool operator< ( const Mouse ms ) const { return w < ms.w; }
} m[ N ];
int dp[ N ], pre[ N ];
void Print ( int idx ) {
if ( pre[ idx ] == -1 ) {
printf ( "%d\n", idx );
return;
}
Print ( pre[ idx ] );
printf ( "%d\n", idx );
}
//下降
int LIS ( int n ) {
int mx = 0;
memset ( pre, -1, sizeof ( pre ) );
for ( int i = 1; i < n; ++i ) {
dp[ i ] = 1;
for ( int j = 1; j < i; ++j ) {
if ( m[ j ].w < m[ i ].w && m[ j ].s > m[ i ].s && dp[ i ] < dp[ j ] + 1 ) {
dp[ i ] = dp[ j ] + 1;
pre[ m[ i ].id ] = m[ j ].id;
}
}
if ( dp[ i ] > mx )
mx = dp[ i ];
}
return mx;
}
int main () {
int w, s;
int n = 1;
while ( ~scanf ( "%d%d", &w, &s ) ) {
m[ n ].id = n;
m[ n ].w = w;
m[ n ].s = s;
++n;
}
sort ( m, m + n );
int v = LIS ( n );
printf ( "%d\n", v );
for ( int i = 1; i < n; ++i )
if ( dp[ i ] == v ) {
Print ( m[ i ].id );
break;
}
return 0;
}