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

 

转载于:https://www.cnblogs.com/xiaxiaosheng/p/3197004.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值