思路:
LIS 变种,输出路径 ,故使用三角形动归比较方便。坑不少,还是做出来了。合并成一句话:因为是倒序输出,想要先输出 w 小(v 大)的;因此要把 w 小的放后边,因此要在 sort 时把 w 小的放后边
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005 ;
struct NODE{
int id;
int w;
int v;
friend bool operator < ( NODE a , NODE b)
{
if ( a. w == b. w)
return a. v < b. v;
return a. w > b. w;
}
} node[ maxn] ; int cnt = 0 ;
int dp[ maxn] ;
int ans = 0 ;
int path[ maxn] ;
int main ( ) {
int l, r;
while ( cin>> l>> r) {
cnt++ ;
node[ cnt] . id = cnt;
node[ cnt] . w = l;
node[ cnt] . v = r;
}
sort ( node+ 1 , node+ cnt+ 1 ) ;
memset ( path , 0 , sizeof ( path) ) ;
for ( int i= 1 ; i<= cnt; i++ ) {
dp[ i] = 1 ;
for ( int j= 1 ; j< i; j++ )
if ( node[ i] . w < node[ j] . w && node[ i] . v > node[ j] . v)
if ( dp[ i] < dp[ j] + 1 ) {
dp[ i] = dp[ j] + 1 ;
path[ i] = j;
}
ans = max ( ans , dp[ i] ) ;
}
cout<< ans<< endl;
int i;
for ( i= cnt; i; i-- )
if ( dp[ i] == ans)
break ;
while ( i) {
cout<< node[ i] . id<< endl;
i = path[ i] ;
}
return 0 ;
}