HDU 1176 免费馅饼

初看起来貌似没什么思路,后来慢慢发现这题原来就是数塔问题的变形啊,还是用dp做,只不过将时间看作是行,将位置看做是列。状态转移方程为:f[i][j] = get_max(f[i + 1][j], f[i + 1][j + 1], f[i + 1][j - 1]) + a[i][j].

由于位置有0-10共11个,所以在记录数据的时候记成1-11比较方便,防止数组越界。

AC code:

View Code
 1 #include <iostream>
2 #define MAX 100001
3 using namespace std;
4 int Hash[MAX][20];//用二维数组在存数据,第一维表示时间,第二维表示位置坐标,整体表示第i秒在坐标为j的地方掉下的馅饼数
5 int f[MAX][20];
6 int n;
7
8 int get_max(int a, int b, int c)
9 {
10 int max = -1;
11 if(a < b)
12 a = b;
13 if(a < c)
14 a = c;
15 return a;
16 }
17 int main()
18 {
19 while(scanf("%d", &n)!= EOF && n)
20 {
21 int tp, tt, time = 0;
22 memset(f, 0, sizeof(f));
23 memset(Hash, 0, sizeof(Hash));
24 for(int i = 0; i < n; i++)
25 {
26 scanf("%d%d", &tp, &tt);
27 Hash[tt][tp + 1]++;
28 if(time < tt)
29 time = tt;
30 }
31 for(int i = 0; i <= 10; i++)
32 f[time][i + 1] = Hash[time][i + 1];
33 for(int i = time - 1; i >= 0; i--)
34 for(int j = 1; j <= 11; j++)
35 f[i][j] = get_max(f[i + 1][j], f[i + 1][j + 1], f[i + 1][j - 1]) + Hash[i][j];
36 printf("%d\n", f[0][6]);
37 }
38 return 0;
39 }



posted @ 2012-03-27 16:27  背着超人飞  阅读(369)  评论(0)    收藏  举报