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; }
相关文章推荐
- 【最长上升子序列记录路径(n^2)】HDU 1160 FatMouse's Speed
- HDU 1160 FatMouse's Speed (最长上升子序列)
- HDOJ1160 FatMouse's Speed[dp](最长上升子序列)
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu1160简单dp最长下降子序列
- HDU - 1160FatMouse's Speed(最长上升子序列+输出顺序)
- hdu1160简单dp最长下降子序列
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 FatMouse's Speed(最长不下降子序列+输出路径)
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- HDU 1160 FatMouse's Speed (最长上升子序列+记录路径)
- hdu 1160 dp (二维最长上升子序列 记录路径
- HDU1160 FatMouse's Speed 带路径的最长上升子序列问题
- HDU 1025 Constructing Roads In JGShining's Kingdom (简单dp, 最长上升子序列LIS)
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- HDU 1160 FatMouse's Speed (最长上升子序列+记录路径)
- hdu 1160 dp (二维最长上升子序列 记录路径