文章目录

  • 题意
  • 思路
  • 求解动态规划的四个步骤
    • 一、确定状态
    • 二、 状态转移方程
    • 三、初始条件和边界情况
    • 四、计算顺序
  • 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动态规划)相关推荐

  1. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  2. python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...

    最大K乘积问题设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 编程任务: 对于给定的I 和k ...

  3. DP动态规划-爬塔(双层dp)

    DP动态规划-爬塔(双层dp) 比赛来源:牛客 - 中国计量大学现代科技学院第四届"中竞杯"程序设计校赛 题目--------F题 description: 高川最喜欢的游戏当属 ...

  4. DP动态规划--最大子段和问题

    DP–最大子段和问题(动态规划) 问题: 有n个整数组成一个a1,a2,a3,- ,an序列.求其子段和的最大值(子段是连续的) 比如{-2,11,-4,13,-5,-2},最大子段和就是11-4+1 ...

  5. C++入门算法1——dp(动态规划)

    dp(动态规划)是十分重要的一个算法,一般来说这种算法会比dfs(深度优先搜索)快很多. 首先先来看一道例题 题目链接:P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生 ...

  6. DP动态规划企业级模板分析(数字三角,上升序列,背包,状态机,压缩DP)

    前言 经过基础的算法模型讲解和题海战术,将DP动态规划这个重点呢考纲进行细分题类型,此篇是上半章节的DP动态分析提升题.主要包括数字三角形,以及最大上升序列,背包问题,状态机的拆分以及优化状态机的压缩 ...

  7. 模板 - DP动态规划

    整理的算法模板合集: ACM模板 目录 一:[背包] 二:[树形DP] 三:[数位DP] 四:[DP 的优化] 五:[插头 DP] 一:[背包] 1.[01背包] #include<algori ...

  8. 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 ...

  9. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  10. dp动态规划_最短路径累加和最大问题

    7  3 8  8 1 0  2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找一条从顶部到底边的路径,使得 路径上所经过的数字之和最大.路径上的每一步都只能往正下或 右下走.只需要求出这个 ...

最新文章

  1. Linux IO多路复用之Select简史
  2. python使用pickle保存和加载机器学模型
  3. 地脚螺钉直径系列_百科:螺栓、螺钉、螺丝三个概念,别再傻傻分不清!
  4. python编程可以做什么工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
  5. Linux设置环境变量小结
  6. Quartz-SimpleTrigger解读
  7. 最简单的基于FFmpeg的AVfilter的例子-修正版
  8. 渗透测试入门5之内网信息搜集
  9. ocr 图片纠正_2020年10种最佳OCR软件(免费和付费工具) NO.6
  10. java_oop_三大特性
  11. Linux系统负载查询
  12. 网络工具之GNS3安装及使用
  13. [python3] zipfile压缩目录下所有的文档都被压缩,并解决压缩路径过深的问题
  14. gedit文本编辑器
  15. 反向传播(Backpropagation)算法详解
  16. 2022“杭电杯”中国大学生算法设计超级联赛(5)杭电多校第五场
  17. C++实现排列组合问题
  18. 2020启智开发者大会精彩来袭,这些公开课不容错过!
  19. 仓库货架通道宽度的设计要求和注意事项
  20. 软件开发的过程中,这些文档你都用到了吗?

热门文章

  1. Facebook登陆时遇到的问题
  2. 无线ap 热图测试软件,无线AP功能测试
  3. 【渗透测试】--- rbash逃逸方法简述
  4. 通俗地讲一下庞加莱猜想是怎么回事(from 鼓浪)
  5. 计数oracle,SQL数据透视表子组计数
  6. 华为云ECS服务器中通过docker部署sentinel-dashboard
  7. 根号五除以三用计算机算,根号5等于多少怎么算
  8. 用Java来解析torrent文件
  9. java 俄罗斯方块 教程_俄罗斯方块
  10. 深度学习笔记(19) 多任务学习