[JLOI2014]天天酷跑
请允许我对记忆化搜索进行一个总结,我认为所有的搜索只要数据范围允许,都可以转化为记忆化搜索,
只是,用处的多与少的关系,其本身是求出设出状态之后,为求出当前状态进行递推(搜索),推到
已知状态,之后再退回来的一个方法,由于将每个子状态的解存下来是他和dfs最大的不同,所有说只要
定义出状态,就可以记忆化搜索;不废话了,开始讲题了:
在游戏天天酷跑中,最爽的应该是超级奖励模式了吧,没有一切障碍,可以尽情的吃金币,现在请你控制游戏角色来获得尽可能多的分数。游戏界面离散为一个长度为1~n,高度为1~m(初始点为(0,1))的矩阵图。每个格子上都有收益(-1~1000),-1表示该点不能通过。游戏角色从起点一路奔跑向终点,中途可以跳跃来获得更高的分数,在空中还能进行连跳。
游戏开始前你可以设定跳跃的高度,以及能连跳的次数,初始跳跃高度为1,连跳数为1(最多为5),升级跳跃高度和连跳都需要一定的花费。跳跃高度设定完后游戏角色每次跳跃高度都将固定,连跳必须在下落过程中可以使用。所有操作都将在整点上完成,需要保证设定完的跳跃高度及连跳数,无法跳出游戏高度上限。以下是连跳数为2连跳,跳跃高度为2的跳跃方案:
输入输出格式
输入格式:
第一行四个整数n,m,cost1,cost2。n,m如题意所示,cost1,cost2分别表示每升一级跳跃高度,连跳数所需的花费。接下来m行,每行n个数。第i行第j个数表示地图中高度为i,
输出格式:
如果无法跑出终点线,就输出”mission failed“,否则输出一行三个数,分别表示最大收益;及最大收益时,最小的连跳数;最大收益,最小连跳数时,最小的跳跃高度。
题解:
正如上文所说,正是记忆化,定义状态f[i][j][o]表示处于x,y这个位置,还剩余o次连跳数的最大收益,那么状态转移就不难想到了,
如果是跑——f[i][j][o]=max(f[i][j+1][o]+w[i][j]) w[i][j]为这点的权值;
如果是跳的话——f[i][j][o]=max(f[i+跳跃高度(high)][j+high][o--]+hhh+w[i][j]) hhh跳跃上升过程中得到的金币数。
实现时将跳和连跳合并了,只要出了类似,合并情况可以大量减少代码量;
代码:
- #include<iostream>
- #include<stdio.h>
- #include<stdlib.h>
- #include<algorithm>
- #include<cstring>
- const int inf=<<;
- using namespace std;
- int n,m,cost1,cost2;
- int f[][][];
- bool b[][][];
- int w[][];
- int dfs(int x,int y,int time,int high,int use){
- if(x>n) return ;
- if(w[y][x]==-) return -inf;
- if(b[y][x][use]) return f[y][x][use];
- int hhh=,flag=,tot=;
- if(y==) use=;
- if(use<time){
- for(int i=;i<high;i++){
- if(w[y+i][x+i]==-) {flag=;break;}
- hhh+=w[y+i][x+i];
- }
- if(flag==) tot=max(tot,hhh+dfs(x+high,y+high,time,high,use+));
- }
- if(y==) tot=max(tot,dfs(x+,y,time,high,));
- if(y>) tot=max(tot,dfs(x+,y-,time,high,use));
- b[y][x][use]=;
- f[y][x][use]=tot+w[y][x];
- return f[y][x][use];
- }
- int main()
- {
- cin>>n>>m>>cost1>>cost2;
- for(int i=;i<=m;i++){
- for(int j=;j<=n;j++){
- cin>>w[i][j];
- }
- }
- int ans=-inf,ans1,ans2;
- for(int i=;i<=;i++){
- for(int j=;j*i<m;j++){
- memset(b,,sizeof(b));
- memset(f,-,sizeof(f));
- int now=dfs(,,i,j,)-cost2*(i-)-cost1*(j-);
- if(ans<now) ans=now,ans1=i,ans2=j;
- }
- }
- if(ans==) {printf("mission failed");return ;}
- if(ans<) printf("mission failed");
- else printf("%d %d %d",ans,ans1,ans2);
- return ;
- }
[JLOI2014]天天酷跑的更多相关文章
- bzoj3628: [JLOI2014]天天酷跑
题目链接 bzoj3628: [JLOI2014]天天酷跑 题解 开始读错题目了,尴尬 由于题目说的跳跃次数和高度是在一开始设定的. 发现枚举一下记忆化搜索就可以过了 要注意,跳到最高点是可以不下坠继 ...
- Android版xx助手之天天酷跑外挂具体分析
Android版xx助手之天天酷跑外挂具体分析 图/文 莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也開 ...
- 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)
下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...
- cocos2d 简单的日常高仿酷跑游戏
1.第一个直接看看这个游戏看起来视频(GIF我们不能满足游戏展) 跑酷游戏最纠结的是地图.碰撞倒是简单,能够自己写或者使用box2d等物理引擎.跑酷游戏地图的特点就是随机性.可是随机中又有策划特意安排 ...
- [置顶] cocos2d-x 植物大战僵尸(13)类似酷跑的【同一角色不同动画间的切换的实现】
有几天没和大家分享博客了,原因很简单,就是我在运行第12章所写的代码时:(开始一切正常,不过没多久就出现了内存泄露!.可能求成心切吧,当时没多加考虑就把代码发上去了.我在此对看过第12章得 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 站在风口,你或许就是那年薪20w+的程序猿
最近面试了一些人,也在群上跟一些群友聊起,发现现在的互联网真是热,一些工作才两三年的期望的薪资都是十几K的起,这真是让我们这些早几年就成为程序猿的情何以堪!正所谓是站在风口上,猪也能飞起来!我在这里就 ...
- 相关query挖掘
1.何为相关query 我通常也把相关query称为相似query,搜索日志中一个用户在短时间内的一系列搜索词被称为相关query.相关就是两个query间有一定的关系,反映了用户在当时的需求.本文就 ...
- iOS开发之如何跳到系统设置里的各种设置界面
跳到更多设置界面 除了跳到WiFi设置界面,能不能跳到其他的设置界面呢?比如:定位服务.FaceTime.音乐等等.都是可以的,一起来看看如何实现的! 定位服务 定位服务有很多APP都有,如果用户关闭 ...
随机推荐
- 【Offer】[59-2] 【队列的最大值】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和 pop_front 的时间复杂度都是0(1). ...
- SpringCloud学习笔记(1):Eureka注册中心
简介 Eureka是Netflix开源的基于rest的服务治理方案,分为Server端和Client端,Server端为注册中心,其他微服务通过Client端连接Server端进行服务的注册和发现. ...
- Vue兄弟组件通信
Vue兄弟组件通信之借助中央事件总线 下载链接:https://www.yinxiangit.com 其实要实现兄弟组件通信,就算是通过父子组件通信的方式也是可以达到的,如 子 ——>父——&g ...
- 解决python -m pip install --upgrade pip 升级不成功问题
1.使用命令出现. You are , however version is available. You should consider upgrading via the 'python -m p ...
- Redis是否安装
1.Redis对否安装(安装好了会出现下面对应的代码) [lk@localhost /]$ whereis redis-cli redis-cli: /usr/local/bin/redis-cli ...
- hbase shell命令及Java接口介绍
一. shell命令 1. 进入hbase命令行 ./hbase shell 2. 显示hbase中的表 list3. 创建user表,包含info.data两个列族create 'user', ...
- 学生管理系统——ArrayList集合
此学生管理系统利用了集合ArrayList实现了对学生的增删改查:利用数组中的方法实现分数排序:运用String类的equals实现登录功能的字符串比较. 管理员类: package data; pu ...
- Python语法基础之DataFrame
转载自https://blog.csdn.net/lijinlon/article/details/81676859 Python数据分析首先需要进行数据清洗处理,涉及到很多DataFrame和Ser ...
- [Pandas] 03 - DataFrame
DataFrame 表格基本操作 初始化 一并设置 index & columns 类似于倒排表,column相当于words. index就是doc id. df = pd.DataFram ...
- APP功能测试要点
1.功能性测试 根据产品需求文档编写测试用例而进行测试,包括客户端的单个功能模块以及功能业务逻辑(功能交互)如:涉及输入的地方需要考虑等价类,边界值,异常或非法等 1.1 安装与卸载测试 >软件 ...