HDU 1160 FatMouse's Speed
题目大意是找到一个最多的老鼠序列,使得序列中的老鼠的体重满足递增,相应老鼠的速度满足递减。思路就是先按体重递增进行sort排序,然后按照体重找到最长递减子序列即可,用动态规划做比较简单。状态f[i]表示前i个老鼠中的最长递减子序列长度,状态转移方程为f[i] = max{f[j], mice[j].speed > mice[i].speed} + 1, 最后找出最大的f[i]即可。注意此题还需要输出找到的序列中的老鼠的最原始的标号,因此不仅要在刚开始的时候把每个老鼠的最初的序号记下来,还要在进行状态转移的时候把当前的老鼠的位置标记下来。
AC code:
1 #include <iostream>
2 #include <stdlib.h>
3 #include <algorithm>
4 #define MAX 10000
5 using namespace std;
6
7 struct Fat_mouse{
8 int wei;
9 int speed;
10 int number;
11 }mice[MAX];
12
13 int num;
14 int f[MAX];
15 int No[MAX];
16 int g[MAX];//用来记录找到的最长序列中的老鼠的在排序后序列中的位置
17
18 bool cmp(Fat_mouse x, Fat_mouse y)
19 {
20 return x.wei < y.wei || (x.wei == y.wei && x.speed < y.speed);
21 }
22
23 int max(int i)
24 {
25 int max = 0;
26 int max_j = 0;
27 for(int j = 0; j < i; j++)
28 if(f[j] > max && mice[i].speed < mice[j].speed)
29 { max = f[j];
30 max_j = j;
31 }
32 No[i] = max_j;
33 return max;
34 }
35 int main()
36 {
37 int i = 0, max_i;
38 f[0] = 1;
39 int max_f = 0;
40 while(cin >> mice[i].wei >> mice[i].speed)
41 {i++;}
42 num = i;
43 for(i = 0; i < num; i++)//记录每只老鼠的原始次序
44 mice[i].number = i+1;
45 sort(mice, mice + num, cmp);
46 for(i = 0; i < num; i++)
47 f[i] = max(i) + 1;//状态转移方程
48 for(i = 0; i < num; i++)
49 if(f[i] > max_f)
50 {
51 max_f = f[i];//找到最长的序列
52 max_i = i;//记录最长序列中最后一只老鼠的下标
53 }
54 printf("%d\n", max_f);
55 for(i = max_f - 1; i >= 0; i--)
56 {
57 g[i] = max_i;
58 max_i = No[max_i];
59 }
60 for(i = 0; i < max_f; i++)
61 printf("%d\n", mice[g[i]].number);
62 return 0;
63
64 }
 
                     
                    
                 
                    
                 
 
                
            
        