一、概述

1、问题描述

在一个长度为10的数轴中,从0到10编号,gameboy站在坐标为5的点,此刻时间为0。

已知,每过1秒,在不同的坐标点都有可能出现馅饼,并且gameboy每秒钟只能走1个数轴单位的距离,求在已知馅饼掉落的时间和位置下gameboy可以得到的最多馅饼数,在每个位置可能同时出现多个馅饼。

2、问题链接

HDU -- 免费馅饼(ACM Step: 3.2.8)

3、问题截图

图1.1  问题截图

二、算法思路

此题和数塔问题类似。

假设t表示当前的时间,即t=0,p表示当前的位置,即p=5。

在t=1时,gameboy可以走到p=4、5、6这三个位置,他要走到哪个呢?他应该走到可以得到最大值的位置,因此需要继续分析,4、5、6哪个才能得到最大值。现在问题变成了找到t=1时,p=4、5、6这三个位置的最大值中的较大者。

对于4,要求它的最大值,需要在t=2时,从p=3、4、5三个位置中找出最大值,然后加上它自己所带有的馅饼数。

对于5,要在t=2时,从p=4,5,6中的最大值,并且加上自己的馅饼数。

6也是一样。

可以发现,最后几乎要求在所有可能的t,以及所有可能的位置p,中可以得到的最大值问题。

由于最后一层可以得到的最大值就是它们本身的馅饼数,因此可以从最下层往上构造,这样同时可以保证对每个子问题只求过一次。

也可以使用递归,假设问题求在(t=0,p=5)的最大值,那么它可以转变为(1,4),(1,5),(1,6)三个字问题,即可以使用3次递归。

要求解(1,4),即求解(2,3),(2,4),(2,5)

要求解(1,5),即求解(2,4),(2,5),(2,6)

要求解(1,6),即求解(2,5),(2,6),(2,7)

可以发现用递归会使得同一个子问题如(2,5)要被计算多次,所以使用从下向上的解法将避免这个问题。

三、算法实现

#include <cstdio>    // for printf, scanf
#include <array>using std::array;const int COORDINATE_NUMS = 11;
const int MAXSIZE = 1e5;
array<array<int, COORDINATE_NUMS>, MAXSIZE> data;    // input 2d-array, data[i][j] indicating whether time i and position j have input
array<array<int, COORDINATE_NUMS>, MAXSIZE> ans;    // ans for answer, result 2d-array that assume gameboy begin at time i and position jint input(int);    // for input data
int calculate(int);    // for calculate result
void print(int);    // for print resultint main()
{int n;while (1){scanf("%d", &n);if (n == 0)break;n = input(n);n = calculate(n);print(n);// clear array for next inputdata = array<array<int, COORDINATE_NUMS>, MAXSIZE>();ans = array<array<int, COORDINATE_NUMS>, MAXSIZE>();}return 0;
}
// get max value of 2 integer
int get_2_max(int a, int b)
{return (a>b)?a:b;
}// get max value of 3 integer
int get_3_max(int a, int b, int c)
{int ret = a;if(b > ret)ret = b;if(c > ret)ret = c;return ret;
}
// read input data, return the depth of digit tower
int input(int n)
{int x, t;int ret = 0;for (int i=0; i<n; ++i){scanf("%d%d", &x, &t);++data[t][x];if (t > ret)ret = t;}return ret;
}// calculate the result, T indicate the max value of input time
int calculate(int T)
{int t = T;    // t indicate array index of the current time// max vale of the last time of position i is itselffor (int i=0; i<COORDINATE_NUMS; ++i)ans[t][i] = data[t][i];--t;    // done with time t, t indicate to prior time nowfor (int i=t; i>=0; --i){// the max value of position 0 and 10 of time i depend on positon 0, 1 and 9, 10 of time i+1, respectivelyans[i][0] = get_2_max(ans[i+1][0], ans[i+1][1]) + data[i][0];ans[i][10] = get_2_max(ans[i+1][9], ans[i+1][10]) + data[i][10];// other positons depends on three value of time i+1for (int j=1; j<COORDINATE_NUMS-1; ++j)ans[i][j] = get_3_max(ans[i+1][j-1], ans[i+1][j], ans[i+1][j+1]) + data[i][j];}return ans[0][5];
}// print the result
void print(int n)
{printf("%d\n", n);
}

HDU -- 免费馅饼(ACM Step: 3.2.8)相关推荐

  1. 免费馅饼 HDU - 1176

    免费馅饼 HDU - 1176 题意: 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...

  2. 动态规划训练18 [免费馅饼 HDU - 1176 ]

    免费馅饼 HDU - 1176 这也是一道比较简单的动态规划 dp[i][j]表示到时间i,位置为j所能采集的最大馅饼数量 状态转移非常好写 dp[i][j] = max{dp[i-1][j],dp[ ...

  3. HDU 1176 免费馅饼(记忆化搜索)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. HDU 1176 免费馅饼 (动态规划、另类数塔)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. hdu 1176 免费馅饼(DP)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. NYOJ 613免费馅饼

    免费馅饼 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gamebo ...

  7. 免费馅饼 (DP动态规划问题详细解析)

    免费馅饼 HDU - 1176 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米 ...

  8. 免费馅饼 (动态规划)

    HDU 1176 免费馅饼 (动态规划) Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在 ...

  9. NYOJ 613 免费馅饼

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

最新文章

  1. GitHub开源:17M超轻量级中文OCR模型、支持NCNN推理
  2. Android事件分发机制详解
  3. copy时候明细消失没有了
  4. php图片传入及改名代码,WordPress添加媒体中文名图片上传改名(优化版)
  5. GNU make manual 翻译(八十七)
  6. tensorflow学习(2.网络模型的存储以及提取)
  7. spark的三种运行模式以及yarn-client和yarn-cluster在提交命令上的区别
  8. 双机通信c语言程序,双机通信(C语言、主机和从机共用程序)
  9. linux下配置samba服务器(以CentOS6.7为例)
  10. gatewayproperties 是空_杨丞琳演唱会踩空,从二楼高台掉到一楼,手脚擦伤,引发网友热议...
  11. Java中equals和==
  12. python tableview绑定字典_在QTableView中使用各种自定义委托
  13. 移动端前端开发技术概况
  14. 上海电力学院计算机专业在校区,上海电力学院有几个校区及校区地址 哪
  15. 数位笔的笔芯磨损到什么程度需要更换?压感笔笔芯怎么更换?
  16. SQL 横转竖 、竖专横(转载) 列转行 行转列 表旋转
  17. oracle中private同义词和public同义词
  18. 变量被重复定义的问题的讨论
  19. 笔记本电脑属于个人计算机吗,黄真真:笔记本电脑属于个人计算机的一种形式莫?...
  20. 什么软件可以用蓝牙测试信号,litepoint IQview蓝牙测试仪/无线wifi网络信号测试仪...

热门文章

  1. 计算机管理用户和组无法访问,用户和组管理权限及文件访问控制
  2. 计算机考研复试之软件工程三十问
  3. 你总是喜欢抓不住的东西
  4. JDBC——商品品牌数据的增删改查操作
  5. 谷牛期权持仓重心上移
  6. Spring Boot+JSP
  7. 源码篇:ReentrantLock 源码分析上篇
  8. BRD文件转AD文件
  9. ASP.NET MVC 音乐商店 - 8. 使用 Ajax 更新的购物车
  10. [数论 反演] BZOJ 4833 最小公倍佩尔数