Mortal Kombat Tower (dp动态规划)
文章目录
- 题意
- 思路
- 求解动态规划的四个步骤
- 一、确定状态
- 二、 状态转移方程
- 三、初始条件和边界情况
- 四、计算顺序
- AC代码:
题意
A和B两人玩通关游戏,每个关卡分为难(a[i]=1)和简单(a[i]=0),A可以通过任意难度的关卡,B只能通过难度为0的关卡,但是B在遇到难度为1的关卡的时候,可以选择跳跃一次,A和B轮流交替通关,每一轮两人最少可以通关一关,最多通关两关,B始终第一个开始,问:最终通关时,B进行跳跃的最少次数
题目传传送门:点击进入
思路
由于是需要求一个最优解,同时这个最优解由AB两人的选择控制,为了维护这个结果最优,需要每个回合两人的选择都是最优的,同时A的选择还会影响到B的选择。所以我们考虑动态规划进行求解。
求解动态规划的四个步骤
一、确定状态
设数组dp[i][0]表示第i轮中 B消耗的跳跃次数, dp[i][1]表示第i轮中,A消耗的跳跃次数。
两个意识:
1.最后一步
即最终的一个状态。本题中的最后一个状态应该是min( dp[n][0], dp[n][1] )
2.子问题
由于我们的每一轮的最终答案是由上一轮的结果来决定,所以我们可以将每个问题化解成它的子问题,在本题中,我们考虑走到最后一关的最优解,则可以将问题拆解为最后一关的最优解+前面通过的所有关卡的最优解,不断拆分,就可以将问题简化为我们已知的问题。
二、 状态转移方程
对于dp问题,最关键的就是推出该问题的状态转移方程,在本题中,我们设数组dp[i][0]表示第i轮中 B消耗的跳跃次数,
dp[i][1]表示第i轮中,A消耗的跳跃次数。由于AB两人在自己的回合可以选择通过1关或者2关,所以我们需要每一轮都选择二者中消耗跳跃步数最少的一个决策,以确保最后的决策是最优的。
对于第i回合的B来说:
选择通1关:
dp[i][0] = dp[i-1][1] + a[i];
选择通2关:因为是通两关,所以要加上a[i-1]和当前的关卡a[i]
dp[i][0] = dp[i-2][1] + a[i-1] + a[i]
第i轮B的最优策略为:dp[i][0] = min( dp[i-1][1] + a[i],dp[i-2][1] + a[i-1] + a[i] )
对于第i回合的A来说
选择通1关:
dp[i][1] = dp[i-1][0]
选择通2关:
dp[i][1] = dp[i-2][0]
第i轮A的最优策略为:dp[i][1] = min( dp[i-1][0], dp[i-2][0])
三、初始条件和边界情况
边界情况在本题中不需要考虑。初始条件为:
第一轮:dp[1][0] = a[1] dp[1][1] = 无限大(因为B始终走第一轮)
第二轮:dp[2][0] = a[1] + a[2] dp[2][1] = dp[1][0]
四、计算顺序
一般来说按照从小到大,从左往右,或者对于二维数组来说一行一行的进行计算。
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <math.h>
#include <set>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 2e5 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int a[maxn];
int dp[maxn][2];
int main() {int t = 0;cin >> t;while(t--){int n;cin >> n;for(int i = 1; i <= n; i++){cin >> a[i];}dp[1][0] = a[1];dp[1][1] = INF;dp[2][0] = a[1] + a[2]; //前两个数dp[2][1] = dp[1][0];for(int i = 3; i <= n; i++){dp[i][0] = min(dp[i-1][1] + a[i],dp[i-2][1] + a[i] + a[i-1] + a[i]);dp[i][1] = min(dp[i-1][0],dp[i-2][0]);}cout << min(dp[n][0],dp[n][1]) << endl; }return 0;
}
Mortal Kombat Tower (dp动态规划)相关推荐
- (转)dp动态规划分类详解
dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...
- python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...
最大K乘积问题设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 编程任务: 对于给定的I 和k ...
- DP动态规划-爬塔(双层dp)
DP动态规划-爬塔(双层dp) 比赛来源:牛客 - 中国计量大学现代科技学院第四届"中竞杯"程序设计校赛 题目--------F题 description: 高川最喜欢的游戏当属 ...
- DP动态规划--最大子段和问题
DP–最大子段和问题(动态规划) 问题: 有n个整数组成一个a1,a2,a3,- ,an序列.求其子段和的最大值(子段是连续的) 比如{-2,11,-4,13,-5,-2},最大子段和就是11-4+1 ...
- C++入门算法1——dp(动态规划)
dp(动态规划)是十分重要的一个算法,一般来说这种算法会比dfs(深度优先搜索)快很多. 首先先来看一道例题 题目链接:P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生 ...
- DP动态规划企业级模板分析(数字三角,上升序列,背包,状态机,压缩DP)
前言 经过基础的算法模型讲解和题海战术,将DP动态规划这个重点呢考纲进行细分题类型,此篇是上半章节的DP动态分析提升题.主要包括数字三角形,以及最大上升序列,背包问题,状态机的拆分以及优化状态机的压缩 ...
- 模板 - DP动态规划
整理的算法模板合集: ACM模板 目录 一:[背包] 二:[树形DP] 三:[数位DP] 四:[DP 的优化] 五:[插头 DP] 一:[背包] 1.[01背包] #include<algori ...
- J - Milking Time POJ - 3616(dp动态规划)
Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...
- 『ACM-算法-动态规划』初识DP动态规划算法
一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...
- dp动态规划_最短路径累加和最大问题
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找一条从顶部到底边的路径,使得 路径上所经过的数字之和最大.路径上的每一步都只能往正下或 右下走.只需要求出这个 ...
最新文章
- Linux IO多路复用之Select简史
- python使用pickle保存和加载机器学模型
- 地脚螺钉直径系列_百科:螺栓、螺钉、螺丝三个概念,别再傻傻分不清!
- python编程可以做什么工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
- Linux设置环境变量小结
- Quartz-SimpleTrigger解读
- 最简单的基于FFmpeg的AVfilter的例子-修正版
- 渗透测试入门5之内网信息搜集
- ocr 图片纠正_2020年10种最佳OCR软件(免费和付费工具) NO.6
- java_oop_三大特性
- Linux系统负载查询
- 网络工具之GNS3安装及使用
- [python3] zipfile压缩目录下所有的文档都被压缩,并解决压缩路径过深的问题
- gedit文本编辑器
- 反向传播(Backpropagation)算法详解
- 2022“杭电杯”中国大学生算法设计超级联赛(5)杭电多校第五场
- C++实现排列组合问题
- 2020启智开发者大会精彩来袭,这些公开课不容错过!
- 仓库货架通道宽度的设计要求和注意事项
- 软件开发的过程中,这些文档你都用到了吗?