hdu1160最长递减子序列及其路径

FatMouse‘s Speed

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9069    Accepted Submission(s):
4022
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

总结:不知道这么题怎么回事,输出的结果和测试数据不一样,但是还是ac了。我的输出结果时4,5,9,8

思路:将数据按照重量递增排序,若重量相等,则按照速度递减排序,本题实则求得是排序后的速度v的最长递减子序列。

dp方程:a[i]=a[j]+1,b[i]=j;数组b用于存储其路径

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int b[1001];
 6 int a[1001];
 7 int c[1001];
 8 struct node
 9 {
10     int w;
11     int v;
12     int sign;
13
14 } s[1001];
15 int cmp(node x, node y)
16 {
17     if(x.w==y.w)
18         return x.v>y.v;
19     return x.w<y.w;
20 }
21 int main()
22 {
23     int i,j,flag=-1,k=1,Max=0;
24     while(scanf("%d %d",&s[k].w, &s[k].v)!=EOF)
25     {
26         s[k].sign=k;
27         k++;
28     }
29     sort(s,s+k,cmp);
30     for(i=1; i<k; i++)
31     {
32         a[i]=1;
33         b[i]=-1;
34         for(j=i-1; j>=1; j--)
35         {
36             if(s[i].w>s[j].w && s[i].v<s[j].v && a[j]+1>a[i])
37             {
38                 a[i]=a[j]+1;
39                 b[i]=j;
40             }
41         }
42         if(a[i]>Max)
43         {
44             Max=a[i];
45             flag=i;
46         }
47     }
48     printf("%d\n",Max);
49     int t=0;
50     while(flag!=-1)
51     {
52         c[t]=flag;
53         flag=b[flag];
54         t++;
55     }
56     for(i=t-1; i>=0; i--)
57         printf("%d\n",s[c[i]].sign);
58     return 0;
59 }

时间: 2024-08-01 15:16:41

hdu1160最长递减子序列及其路径的相关文章

最长递减子序列(nlogn)(个人模版)

最长递减子序列(nlogn): 1 int find(int n,int key) 2 { 3 int left=0; 4 int right=n; 5 while(left<=right) 6 { 7 int mid=(left+right)/2; 8 if(res[mid]>key) 9 { 10 left=mid+1; 11 } 12 else 13 { 14 right=mid-1; 15 } 16 } 17 return left; 18 } 19 20 int Lis(int a[

HDU 1160 FatMouse&#39;s Speed (动规+最长递减子序列)

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 4061 Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster

poj 1952 BUY LOW, BUY LOWER (最长递减子序列+不同子序列计数)

BUY LOW, BUY LOWER Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8327   Accepted: 2888 Description The advice to "buy low" is half the formula to success in the bovine stock market.To be considered a great investor you must also f

算法 - 求一个数组的最长递减子序列(C++)

//**************************************************************************************************** // // 求一个数组的最长递减子序列 - C++ - by Chimomo // // 题目: 求一个数组的最长递减子序列,比方{8, 14, 6, 2, 8, 14, 3, 2, 7, 4, 7, 2, 8, 101, 23, 6, 1, 2, 1, 1}的最长递减子序列为{14.8,3.

FatMouse&#39;s Speed hdu 1160(动态规划,最长上升子序列+记录路径)

http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:现给出老鼠的体重与速度,要求你找出符合要求的最长子序列.       要求是 W[m[1]] < W[m[2]] < ... < W[m[n]](体重) && S[m[1]] > S[m[2]] > ... > S[m[n]] (速度) 分析:有两个变量的话比较不好控制,自然需要先排序.再仔细思考的话,觉得和之前做的防御导弹有点类似,都是求最多能有几个符合

最长递减子序列(转载)

Q:例如:有一个序列,例如 9 8 2 1 7 5 3 4 3 2 1.     求出最长的递减子序列.如本例的结果就是:9 8 7 5 4 3 2 1. 分析: 可采用动态规划的思想进行解答,时间复杂度为O(n^2). 设原数组为a[1....n].另设一数组d[1....n],其中d[i]表示从第i个元素开始(一定包含第i个元素),到整个数组末尾的子序列 a[i...n]中的最长递减子序列的长度.       则本问题就是要在求出d[1]的同时,恢复出最优解. 下面给出递推式: d[i]的值

HDU 1160 FatMouse&#39;s Speed (最长上升子序列+记录路径)

题目链接:HDU 1160 FatMouse's Speed 题意:求体重越重,反而速度越慢的例子,并输出对应的编号. 对speed进行从大到小排序,再求weight的最长上升序列,并输出路径. AC代码: #include<stdio.h> #include<algorithm> #include<stack> using namespace std; struct Node { int weight; int speed; int id; }; struct Nod

【编程题目】求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5, 4,3,2}

47.创新工场(算法):求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 思路:动态规划 从最后一个数字开始,计算以当前数字其实的序列的最长递减子序列. 每次找最长子序列,都扫描它之前求得的子序列中最长,且第一个数字比当前数字小的. 如: 第一个数字 2, 最大长度 1, 下一个数字是 第 7 个 第二个数字 3,  最大长度 2, 下一个数字是 第 7 个 第三个数字 4,  最大长度 3, 下一个数字是 第 6 个 第四个数字 5, 

UVa 10285 Longest Run on a Snowboard(DP 二维最长递减子序列)

题意  输入一个城市的滑雪地图  你可以从高的地方滑到伤下左右低的地方  求这个城市的最长滑雪线路长度   即在一个矩阵中找出最长递减连续序列 令d[i][j]为以格子map(i,j)为起点的最长序列   则有状态转移方程d[i][j]=max{d[a][b]}+1  a,b为与i,j相邻且值比i,j小的所有点 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #def