LeeBlog

导航

HDU 1160 FatMouse's Speed 最长上升子序列 简单DP

这题开始看有点麻烦,因为又上升又下降的,但仔细想想,其实只要先处理一个变量,只剩下一个变量是不是就好处理了呢?对的?就跟最长子序列这是链接http://www.cnblogs.com/Lvsi/archive/2011/04/22/2025093.html.整体思路就是对重量排序,然后根据速度的的下降来找到最长的速度下降子序列.

#include<stdio.h>
#include
<stdlib.h>
int n,max;
struct e
{
int w,s,d,pri,flag;
}v[
1005];
int cmp( const void *a,const void *b )
{
return ( ( e * )a )->w - ( (e *)b ) -> w;
}
void DFS( int max )
{
if( v[max].pri == max )
return ;
DFS( v[max].pri );
printf(
"%d\n",v[max].flag );
return ;
}
void DP( )
{
for( int i = 1; i <= n; ++i )
{
int m = 0;
for( int j = 1; j < i; ++j )//找前面的最优值
if( v[j].s > v[i].s && v[j].d > v[m].d )
m
= j;
if( m != 0 )//防止前一个为0
{
v[i].d
= 1 + v[m].d;
v[i].pri
= m;
}
if( v[i].d > v[max].d )//找最大值
max
= i;
if( v[i].d == v[max].d )
if( v[i].w > v[max].w )
max
= i;
}
printf(
"%d\n",v[max].d );
DFS( max );//将最长子序列输出
}
int main( )
{
max
= n = 0;
int w,s;
v[
0].w = v[0].s = v[0].d = v[0].pri = v[0].flag = 0;
while( scanf( "%d%d",&w,&s )!= EOF && w )
{
++n;
v[n].w
= w;
v[n].s
= s;
v[n].d
= 1;
v[n].pri
= 0;
v[n].flag
= n;//序号
}
qsort( v
+ 1,n,sizeof( v[1] ),cmp );//对重量排序
DP( );

return 0;
}

posted on 2011-04-27 19:14  LeeBlog  阅读(266)  评论(0编辑  收藏  举报