解题报告:
小明走在一条小路上,这条小路的长度是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 ",map[0][5]); 28 } 29 return 0; 30 }