HDU 1176 免费馅饼 DP类似数塔题

解题报告:

小明走在一条小路上,这条小路的长度是10米,从左到右依次是0到10一共十个点,现在天上会掉馅饼,给出馅饼掉落的坐标和时间,一开始小明的位置是在坐标为5的位置,

他每秒钟只能移动一米的距离,问他最多能得到多少个馅饼。

这题可以说是一个动态规划题,就是一个数塔的变形,而且跟数塔的区别很小,我们可以把时间当成是数塔中的层,坐标就是数塔中的横向的位置,然后就是从时间最大的那一层出发,往时间最小的方向递归,最后得到的dp[0][5]就是我们所要的结果。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 int max(int a,int b,int c) {
 5     int ans = std::max(a,b); 
 6     return std::max(ans,c);
 7 }
 8 int map[100005][11];
 9 int main() {
10     int n,x,t;
11     while(scanf("%d",&n)&&n) {
12         memset(map,0,sizeof(map));  //初始化都为0 
13         int Tm = 0;          //求出最大的时间 
14         for(int i = 1;i<=n;++i) {
15             scanf("%d%d",&x,&t);
16             Tm = std::max(Tm,t);
17             map[t][x]++;
18         }
19         for(int i = Tm - 1;i>=0;--i)
20         for(int j = 0;j<=10;++j) {
21             if(j==0)
22             map[i][j] += std::max(map[i+1][j],map[i+1][j+1]);
23             else if(j==10)
24             map[i][j] += std::max(map[i+1][j],map[i+1][j-1]);
25             else map[i][j] += max(map[i+1][j-1],map[i+1][j],map[i+1][j+1]);
26         }
27         printf("%d\n",map[0][5]);
28     }
29     return 0;
30 }
View Code

 

posted @ 2013-07-17 22:36  xiaxiaosheng  阅读(204)  评论(0编辑  收藏  举报