HDU1160——FatMouse's Speed
来源:互联网 发布:fedora 26 yum 编辑:程序博客网 时间:2024/06/15 14:47
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160
题目分析:输入一组体重和速度的数据,找到尽可能长的序列,满足体重严格递增,速度严格递减。
解题思路:先按体重升序排列,然后在排列后的数据中找到最长的递减的序列。这里由于不仅仅是要你输出序列的长度,还要输出最长的序列是由哪些数据组成。这样在DP的同时,需要记录每一个最优解得到的过程。
其实这个跟求最长递增序列是一样的思路。参考:http://blog.csdn.net/kay_zhyu/article/details/8713068
这里,用一个flag数组来记录,数据i之前的速度比i大的最长的点的编号。在最后打印的时候,需要翻转过来,按体重升序打印。
参考代码:
#include <stdio.h>#include <stdlib.h>#define M 1005struct tu{int w;int s;int ID;}a[M];int dp[M];int flag[M];int temp[M];int compare(const void *a, const void *b){struct tu *t1 = (struct tu *)a;struct tu *t2 = (struct tu *)b;return t1->w - t2->w;}void main(){int n,i,j;int nMax,r;n= 0;while(scanf("%d %d",&a[n].w,&a[n].s) != EOF){a[n].ID = n + 1;++n;}//按体重升序排列qsort(a,n,sizeof(a[0]), compare);nMax = 0;for(i = 0; i < n; ++i){dp[i] = 1;flag[i] = -1;for(j = 0; j < i; ++j){if(a[j].s > a[i].s && dp[i] < dp[j] + 1){dp[i] = dp[j] + 1;flag[i] = j;//记下到i的最大的j的编号}}if(dp[i] > nMax){nMax = dp[i];r = i;}}printf("%d\n",nMax);i = 0;while(r >= 0){temp[i++] = r;//用temp数组来辅助,把结果反转过来输出r = flag[r];}for(; i > 0; --i){printf("%d\n",a[temp[i - 1]].ID);}}
- HDU1160——FatMouse's Speed
- HDU1160--FatMouse's Speed
- HDU1160 FatMouse's Speed
- HDU1160 FatMouse's Speed
- hdu1160,FatMouse's Speed
- HDU1160--FatMouse's Speed
- hdu1160 FatMouse's Speed
- HDU1160 FatMouse's Speed
- hdu1160 FatMouse's Speed
- HDU1160 FatMouse's Speed
- hdu1160 FatMouse's Speed
- [HDU1160]-FatMouse's Speed
- hdu1160 FatMouse's Speed
- HDU1160——FatMouse's Speed(DP入门)
- HDU1160 FatMouse's Speed LIS变种+路径
- hdu1160 FatMouse's Speed(LIS普通法)
- hdu1160 FatMouse's Speed--DP&记录路径
- hdu1160 FatMouse's Speed (子序列
- include和require的区别
- 深入理解Java虚拟机_1_JVM的由来
- LZ77算法
- php中文字符编码的长度,以及设置得到当前(内部)编码的函数
- PHP Session机制解惑
- HDU1160——FatMouse's Speed
- LZ78算法
- 快速幂
- sqoop导入数据到hive
- ssh jxl导出Excel时报错:getOutputStream() has already been called for this response
- Android联系人2--联系人查询
- LZ编码
- 数据库连接-属性文件-XML配置文件
- Oracle SQL*Loader