hdu 1160 简单dp+排序+倒序输出

首先要定义老鼠结构体,然后对老鼠按照先体重,后速度进行排序,排序后能保证体重小速度快的老鼠在前面,然后动态规划时就是求最长上升序列,每次记录前驱,然后递归地输出即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 1007

using namespace std;

struct Mice
{
    int w,s,id;
    bool operator < ( const Mice & a ) const 
    {
        return w < a.w;
        if ( w == a.w ) return s > a.s;
    }
}m[MAX];

int dp[MAX];
int pre[MAX];

void print ( int maxn )
{
    if ( maxn == 0 ) return;
    print ( pre[maxn] );
    printf ( "%d\n" , m[maxn].id );
}

int main ( )
{
    int cnt = 1;
    while ( ~scanf ( "%d%d" , &m[cnt].w , &m[cnt].s ) )
    {
       // cout << m[cnt].w << "  " << m[cnt].s << endl;
       m[cnt].id = cnt;
       cnt++;
    }
    memset ( dp , 0 , sizeof ( dp ) );
    sort ( m+1 , m+cnt );
 /*   cout << "**************************" << endl;
    for ( int i = 1 ; i < cnt ; i++ )
        cout << m[i].w << "  " << m[i].s << endl;
    cout << "**************************" << endl;*/
    m[0].w = 0 ,m[0].s = 99999999;
    int maxn = 0;
    for ( int i = 1 ; i < cnt ; i++ )
        for ( int j = 0 ; j < i ; j++ )
            if ( m[i].w > m[j].w && m[i].s < m[j].s )
                if ( dp[j] + 1 > dp[i] )
                {
                    dp[i] = dp[j] + 1;
                    pre[i] = j;
                    if ( dp[i] > dp[maxn] )
                        maxn = i;
                }
    printf ( "%d\n" , dp[maxn] );
    print ( maxn );
}


你可能感兴趣的:(C++,动态规划)