您的位置:首页 > 其它

hdu--1160--LIS+打印路径

2014-07-18 16:24 162 查看
这题做完 就去吃饭了...

快1年了 没有正常的饮食....

这题 数据蛮小的 1000可以用O(n^2)水过 而且只花了0ms

一般来说 打印路径是正序输出 而我们记录的时候都是 逆序记录的 所以 借用下stack特别好用

      touch me

#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;

const int size = 1010;
struct data
{
int id;
int w;
int speed;
}mice[size];
int road[size];
int len[size];
stack< int >s;

bool cmp( data p , data q )
{
if( p.w == q.w )
return p.speed>q.speed;
return p.w<q.w;
}

bool judge( data& p , data& q )
{
if( q.w>p.w && q.speed<p.speed )
return true;
return false;
}

int main()
{
cin.sync_with_stdio(false);
int ans , pos , cnt;
cnt = pos = 1;
ans = 0;
while( cin >> mice[cnt].w >> mice[cnt].speed )
{
mice[cnt].id = cnt;
len[cnt] = 1;
road[cnt] = -1;
cnt++;
}
sort( mice+1 , mice+cnt+1 , cmp );
while( !s.empty() )
s.pop();
for( int i = 1 ; i<cnt ; i++ )
{
for( int j = i+1 ; j<=cnt ; j++ )
{
if( judge( mice[i] , mice[j] ) )
{
if( len[j] < len[i]+1 )
{
len[j] = len[i]+1;
road[j] = i;
}
if( len[j] > ans )
{
ans = len[j];
pos = j;
}
}
}
}
cout << ans << endl;
for( int i = pos ; ; i=road[i] )
{
s.push( mice[i].id );
if( road[i] == -1 )
break;
}
while( !s.empty() )
{
cout << s.top() << endl;
s.pop();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: