您的位置:首页 > 其它

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

2011-04-27 19:14 621 查看
这题开始看有点麻烦,因为又上升又下降的,但仔细想想,其实只要先处理一个变量,只剩下一个变量是不是就好处理了呢?对的?就跟最长子序列这是链接/article/7117238.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
.w = w;
v
.s = s;
v
.d = 1;
v
.pri = 0;
v
.flag = n;//序号
}
qsort( v + 1,n,sizeof( v[1] ),cmp );//对重量排序
DP(  );
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: