您的位置:首页 > 其它

HDU 1160 FatMouse's Speed

2012-03-01 21:10 211 查看
题目大意是找到一个最多的老鼠序列,使得序列中的老鼠的体重满足递增,相应老鼠的速度满足递减。思路就是先按体重递增进行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];//用来记录找到的最长序列中的老鼠的在排序后序列中的位置

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++)//记录每只老鼠的原始次序
mice[i].number = i+1;
45     sort(mice, mice + num, cmp);
46     for(i = 0; i < num; i++)
47         f[i] = max(i) + 1;//状态转移方程
for(i = 0; i < num; i++)
49         if(f[i] > max_f)
50         {
51             max_f = f[i];//找到最长的序列
max_i = i;//记录最长序列中最后一只老鼠的下标
}
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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: