一、题目大意

都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中期中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)请自行设定输入输出和测试数据。

二、题目简化

馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,每秒移动距离为1,因此在第一秒,他只能接到4,5,6这三个位置中期中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)请自行设定输入输出和测试数据。

三、解题思想

因为在何时何地掉下馅饼都是自己输入的,所以可以把这些数据存入一个X代表时间、Y代表空间的二维数组里,对这个数组进行DP。关键在于从末尾往(0,5)DP,最后跳出循环。还有一个值得注意的问题就是不要让数组溢出。下列代码在DP时从三个方向DP,数组边缘处(左边缘、右边缘)是两个方向DP。

四、具体实现

#include<stdlib.h>
#include<iostream>
using namespace std;
int bing[1000][12];//记录烙饼掉下的时间和位置,行数为时间,列数为位置
int max1(int a, int b, int c)//比较三数大小
{int max = 0;max = a>b ? a : b;//a,b之间较大值传给maxmax = max>c ? max : c;//max,c之间最大者传给maxreturn max;
}
int max2(int a, int b)//用于两数比较,判断临界值时使用
{int max = 0;max = a > b ? a : b;return max;
}
int result(int bing[][12],int tm)//从三个方向,回溯找出最大值
//(边界值时只有两个,下、左或下、右)所以用max1,max2来比较
{for (int i = tm - 1; i >= 0; i--)//用i代表时间{for (int j = 0; j <=10; j++)//用j代表位置{if (j == 0)bing[i][j] += max2(bing[i + 1][j], bing[i + 1][j + 1]);else if (j == 10)bing[i][j] += max2(bing[i + 1][j], bing[i + 1][j - 1]);elsebing[i][j] += max1(bing[i + 1][j], bing[i+1][j-1], bing[i + 1][j + 1]);//回溯时将原有的时刻-位置记录,改为烙饼最大值}}return bing[0][5];
}
int main()
{int n = 0;//烙饼的总数cout << "请输入烙饼的总数:";cin>>n;//用作循环变量cout << "请按照下列格式输入何时何地会掉烙饼:"<<endl<<"例如1 2代表:在第一秒,会有一个饼子掉落在2的位置" << endl;int i = 0;//用于循环的变量int tm = 0;//确定一个最大的时间刻度。for (i = 0; i <n; i++)//记录掉饼的时间和位置{int x, y;//x代表时间,y代表位置cin >> x >> y;bing[x][y]++;if (y > tm)tm = y;//记录一个时刻最大值}int sum = 0;//最后饼的总数sum=result(bing,tm);//调用计算函数cout<<"gameboy最多能获得的烙饼数为:" <<sum<<endl;system("pause");return 0;
}

五、图片展示

DP过程开始时是这样的:蓝色代表与它接触的橘黄色块与他本身的加和,三者或两者(边缘)相加后的结果。就是代码中“bing[i][j] += max2(bing[i + 1][j], bing[i + 1][j + 1])"中的bing[i][j];(结合着代码看更清楚一点)

然后逐步搜索:

第一次内循环完的情况:

第二次内循环完的情况,此时(27)的饼数已由原来的2变为3

第三次内循环完的情况:

第四次内循环完:

实验结果:

C语言(CED)gameboy接馅饼问题相关推荐

  1. 【Rust日报】2021-10-05 Mimic: 一款用Rust语言编写的命令行Gameboy模拟器

    Mimic: 一款用Rust语言编写的命令行Gameboy模拟器 Mimic: A Gameboy emulator written in Rust that can be played on the ...

  2. C语言(CED)有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.

    相信大家在高中数学课上都做过类似于涂色的排列组合问题,那么这个问题如何用程序语言--C语言解决呢? 一.总体思路(如果你只是需要代码,请直接看代码部分) 你应该重视思路,用C语言将之前数学课上的思路重 ...

  3. C语言(CED)从键盘输入一些整数,求出它们的平均值。数据的个数事先不确定,在输入过程中以ctrl+z键(EOF)作为输入结束的标记。

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 要求: 1.从键盘输入一些整数,求出它们的平均值.数据的 ...

  4. C语言(CED)排序算法总结。比较完整和详细

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 内部排序算法有:直接插入排序,折半插入排序, ...

  5. C语言(CED)编写一个程序,求两个字符之间的加减运算。

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 复习C语言,不同的心境遇到了不同的问题: 问题: 编写一 ...

  6. C语言(CED)智力大冲浪——贪心算法第一题

    一.题目大意 小伟报名参加中央电视台的智力大冲浪节目,本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的!接下来主持人宣布了比赛规则: ...

  7. C语言(CED)C语言中双引号和单引号的区别

    最简单的区别: 在字符型变量赋初值时,用单引号:为字符串变量赋初值时用双引号! 具体区别: 1.大小 单引号引起的一个字符,其大小为1个Byte. 双引号引起的字符串,因为在其结尾需加一个二进制&qu ...

  8. C语言(CED)如何用sort函数根据结构体里的某一属性进行排序

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 前几天在编写代码的时候,突然要根据结构体的属性进行从小到 ...

  9. C语言(CED)钢条最优切割收益

    目录 一.题目大意 二.大致思路 三.具体实现 一.题目大意 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条 ...

最新文章

  1. C#各种小知识点总结
  2. Android 监听 WiFi 开关状态
  3. LDA主题模型原文解读
  4. 淘到了一个不错的TF卡读卡器
  5. Linux设备驱动模型2——总线式设备驱动组织方式
  6. Scrum Master
  7. Android多媒体:AudioTrack
  8. UUID 生成器有多快
  9. 编程小白的第一本Python入门书学习笔记
  10. WiFi6技术特点及现状调研
  11. Node.js安装详细步骤教程(Windows版)
  12. java 一年有多少周_Java8根据一年中的第几周获得Monday
  13. 华三H3C路由器配置FTP服务并使用电脑连接ftp传输文件
  14. windows上传ipa文件到苹果开发者中心的教程
  15. 学习并掌握结构化写作方法,提高写作能力 ——结构化写作学习笔记(3)
  16. matlab求两向量夹角_高考数学解题技巧:专题21 平面向量中最值、范围问题高中数学黄金解题模板...
  17. 数据可视化设计师必备的图表规范指南
  18. 99.扩展183.信息系统运维维护服务
  19. blur事件与click事件的冲突
  20. 计算机技术离不开量子力学,高分子与计算机模拟

热门文章

  1. 循环队列的java结构_java数据结构之循环队列(数组实现)
  2. finalize方法_final,finally,finalize三者的含义和区别
  3. PHP与MySQL外文文献译文和原文_读懂外文文献的秘诀在这里丨49周新闻
  4. uniapp 创建与配置 tabbar
  5. @Transactional和@Async 使用场景
  6. 查询某一支接口,指定时间段的数据 按分钟排序
  7. Jmeter5 语言中文
  8. windows 反弹shell_容器内反弹shell的51种姿势
  9. Qt使用socket通信时接收的汉字信息显示时乱码
  10. 微信红包接口 java_【java微信开发】红包接口调用