题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1160

FatMouse's Speed

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17386    Accepted Submission(s): 7694
Special Judge

Problem Description
FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the speeds are decreasing.
 
Input
Input contains data for a bunch of mice, one mouse per line, terminated by end of file.

The data for a particular mouse will consist of a pair of integers: the first representing its size in grams and the second representing its speed in centimeters per second. Both integers are between 1 and 10000. The data in each test case will contain information for at most 1000 mice.

Two mice may have the same weight, the same speed, or even the same weight and speed.

 
Output
Your program should output a sequence of lines of data; the first line should contain a number n; the remaining n lines should each contain a single positive integer (each one representing a mouse). If these n integers are m[1], m[2],..., m[n] then it must be the case that

W[m[1]] < W[m[2]] < ... < W[m[n]]

and

S[m[1]] > S[m[2]] > ... > S[m[n]]

In order for the answer to be correct, n should be as large as possible.
All inequalities are strict: weights must be strictly increasing, and speeds must be strictly decreasing. There may be many correct outputs for a given input, your program only needs to find one. 

 
Sample Input
6008 1300
6000 2100
500 2000
1000 4000
1100 3000
6000 2000
8000 1400
6000 1200
2000 1900
 
Sample Output
4
4
5
9
7
 
Source
 
 
题解:
1.根据体重,先对老鼠进行升序排序。设dp[i]为老鼠i的最大排位,亦是个数。 
2.对于每只老鼠i,枚举体重比它小, 速度比它快的老鼠j(由于经过了排序,所以j的范围为1~i-1),然后更新老鼠i的最大排位dp[i]。
3.dp[i]的最大值即为题目所求, 至于路径输出,设多一个pre[]数组,在跟新dp[i]的同时更新pre[i]就行了。
4.问:为什么要对老鼠进行排序,而不直接枚举呢?
  答:因为对于当前老鼠i,必须先求出体重比它小, 速度比它快的老鼠j的最终dp[j],如果不经过排序, 那么老鼠j可能放在了老鼠i的后面,dp[j]还没最终确定,就要求出dp[i],这样显然是行不通的,因为dp[i]的值是在dp[j]的最终值中转移过来的。换句话说, dp[i]和dp[j]的求解顺序是有明确要求的。
5.相同类型的题目:HDU1069
 
 
代码如下:
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
#define ms(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const double EPS = 1e-;
const int INF = 2e9;
const LL LNF = 2e18;
const int MAXN = 1e3+; struct node
{
int wei, spd, id;
bool operator<(const node &x) {
return wei<x.wei;
}
}mice[MAXN]; int dp[MAXN], pre[MAXN]; void Print(int k) //输出路径
{
if(!k) return;
Print(pre[k]);
printf("%d\n", mice[k].id); //由于经过了排序,所以输出的是原始编号。
} int main()
{
int n = ;
int wei, spd;
while(scanf("%d%d", &wei, &spd)!=EOF)
{
mice[++n].wei = wei;
mice[n].spd = spd;
mice[n].id = n;
} sort(mice+, mice++n);
mice[].wei = -INF, mice[].spd = INF; //!!注意边界条件
memset(dp, , sizeof(dp));
memset(pre, , sizeof(pre)); int k = -;
for(int i = ; i<=n; i++)
for(int j = ; j<i; j++) //下标从0开始, 表明i作为第一个
{
if(mice[i].wei>mice[j].wei && mice[i].spd<mice[j].spd && dp[i]<dp[j]+)
{
dp[i] = dp[j]+;
pre[i] = j; //同时更新pre, 用于输出路径
}
if(k==- || dp[i]>dp[k])
k = i;
} printf("%d\n", dp[k]);
Print(k);
}

HDU1160 FatMouse's Speed —— DP的更多相关文章

  1. HDU 1160 FatMouse's Speed (DP)

    FatMouse's Speed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Su ...

  2. J - FatMouse's Speed dp

    题目链接: https://vjudge.net/contest/68966#problem/J 找最长子串并且记录路径. TLE代码: #include<iostream> #inclu ...

  3. HDU1160:FatMouse's Speed(最长上升子序列,不错的题)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1160 学的东西还是不深入啊,明明会最长上升子序列,可是还是没有A出这题,反而做的一点思路没有,题意就不多说 ...

  4. [HDU1160]FatMouse's Speed

    题目大意:读入一些数(每行读入$w[i],s[i]$为一组数),要求找到一个最长的序列,使得符合$w[m[1]] < w[m[2]] < ... < w[m[n]]$且$s[m[1] ...

  5. FatMouse's Speed

    J - FatMouse's Speed DP的题写得多了慢慢也有了思路,虽然也还只是很简单的DP. 因为需要输出所有选择的老鼠,所以刚开始的时候想利用状态压缩来储存所选择的老鼠,后面才发现n太大1& ...

  6. FatMouse's Speed 基础DP

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. zoj 1108 FatMouse's Speed 基础dp

    FatMouse's Speed Time Limit: 2 Seconds      Memory Limit:65536 KB     Special Judge FatMouse believe ...

  8. zoj 1108 FatMouse's Speed 基础dp

    FatMouse's Speed Time Limit: 2 Seconds      Memory Limit:65536 KB     Special Judge FatMouse believe ...

  9. HDU 1160 FatMouse&#39;s Speed(DP)

    题意  输入n个老鼠的体重和速度   从里面找出最长的序列  是的重量递增时速度递减 简单的DP  令d[i]表示以第i个老鼠为所求序列最后一个时序列的长度  对与每一个老鼠i  遍历全部老鼠j  当 ...

随机推荐

  1. tomcat常见设置

    1.请求日志 tomcat 统一访问日志记录,添加请求响应时间 <Host name="localhost" appBase="webapps" unpa ...

  2. CSS选择器定位的使用

    CSS 可以比较灵活选择控件的任意属性,一般情况下定位速度要比XPath 快,但对于初学者来说比较难以学习使用,下面我们就详细的介绍CSS 的语法与使用.一.CSS 选择器的常见语法: 例如下面一段代 ...

  3. XV6调度

    调度 任何操作系统都可能碰到进程数多于处理器数的情况,这样就需要考虑如何分享处理器资源.理想的做法是让分享机制对进程透明.通常我们对进程造成一个自己独占处理器的假象,然后让操作系统的多路复用机制(mu ...

  4. Go 在游戏行业中的工程实践

    在今年 1 月由七牛云主办的 ECUG Con 十周年盛会上,真有趣技术总监陈明达带来了题为< Go 在游戏行业中的工程实践>的精彩分享,深入讲解了 Go 的工程经验,错误和异常处理,in ...

  5. xth 砍树(codevs 1369)

    题目描述 Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴,小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着rab ...

  6. C++函数的重载,覆盖和隐藏(——高质量编程第14章)

      函数重载概念 只有C++才有重载的概念,C语言没有. 靠行参列表的不同来区别不同的重载函数, 若是全局函数和成员函数同名时,不算重载,因为它们的作用域不同,所以成员函数会将全局函数给隐藏(遮蔽)了 ...

  7. 转 蓝桥杯 历届试题 大臣的旅费 [ dfs 树的直径 ]

    题解: 求树的直径. 转一篇博客:http://www.cnblogs.com/hanyulcf/archive/2010/10/23/tree_radius.html 树的直径是指树的最长简单路.求 ...

  8. spring boot 没有主清单属性

  9. solr请求处理器列表

    List of Request Handlers Available The Javadocs contain a complete list of Request Handlers. Many of ...

  10. java序列化,看这篇就够了

    一.序列化的含义.意义及使用场景二.序列化实现的方式1.Serializable1.1 普通序列化1.2 成员是引用的序列化1.3 同一对象序列化多次的机制1.4 java序列化算法潜在的问题1.5 ...