[DP-LIS] HDU 1160

来源:互联网 发布:盐巴散弹枪 淘宝 编辑:程序博客网 时间:2024/06/06 06:51

题意

给n个老鼠的体重和速度,求找出一个最长的序列,此序列体重递增速度递减

思路

按体重递增排序,再求最长递增(此递增表示体重递增速度递减)子序列。
dp[i] = max(dp[j]+1) 0<=j<=i-1

代码

#include <algorithm>#include <cstring>#include <iostream>#define N 1005#define INF 0x7f7f7f7fusing 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;}
原创粉丝点击