问题描述

  青蛙X正准备跳过一座桥,这座桥被划分为N段,记青蛙所在的起始点为0,桥的末端为N。桥上的一些点有一些石子,这些点是无法跳上去的。青蛙每次跳跃能向前跳跃+1,+2,+3段,现在请你算出跳到末端的总方法数。如果无法到达,请输出”No Way!"

输入格式

  输入数据共N行。

  第一行一个数字N,代表桥的长度。

  接下来N行,表示从点1~N的道路情况,每行一个数字0或1,1表示有石子。

输出格式

  输出一行,为一个整数,代表方法数,无法到达为“No Way!"
  由于数据过大,我们只需要求出 对 1000000007 的余数即可

一、dp

这题类似于那个爬楼梯问题和斐波那契问题,算是爬楼梯问题的改版,中间加入了障碍物和一次跳跃方式从两种变成了三种。

附:爬楼梯问题

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

class Solution {public int climbStairs(int n) {if (n <= 2)return n;int a = 1, b = 2, temp;for (int i = 3; i <= n; i++) {temp = a;a = b;b = temp + b;}return b;}
}

这里的状态转移方程为:dp[i] = dp[i - 1] + dp[i - 2];

易知,本题状态转移方程为dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];

但是这里用到了一维dp数组,用空间复杂度换取时间复杂度,导致最后一个测试点内存超限。

package com.study.蓝桥杯.算法训练;import java.util.Scanner;/*** @author sjn* @date 2022-2-22*/public class ALGO_965进击的青蛙 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int[] arr = new int[N + 1];for (int i = 1; i < N + 1; i++) {arr[i] = sc.nextInt();}if (getRes(arr) == 0) {System.out.println("No Way!");} else {System.out.println(getRes(arr));}}public static long getRes(int[] arr) {int n = arr.length;long[] dp = new long[n];dp[1] = arr[1] == 0 ? 1 : 0;dp[2] = arr[2] == 0 ? dp[1] + 1 : 0;dp[3] = arr[3] == 0 ? dp[1] + dp[2] + 1 : 0;for (int i = 4; i < n; i++) {if (arr[i] == 1) {dp[i] = 0;} else {dp[i] = (dp[i - 1] % 1000000007 + dp[i - 2] % 1000000007 + dp[i - 3] % 1000000007) % 1000000007;}}return dp[n - 1];}
}

二、利用滚动数组优化dp算法

。。,还是内存超限了

package com.study.蓝桥杯.算法训练;import java.util.Arrays;
import java.util.Scanner;/*** @author sjn* @date 2022-2-22*/public class ALGO_965进击的青蛙 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int[] arr = new int[N];for (int i = 0; i < N; i++) {arr[i] = sc.nextInt();}long res = getRes(arr);if (res == 0) {System.out.println("No Way!");} else {System.out.println(res);}}public static long getRes(int[] arr) {int n = arr.length;long[] dp = new long[3];dp[0] = arr[0] == 0 ? 1 : 0;dp[1] = arr[1] == 0 ? dp[0] + 1 : 0;dp[2] = arr[2] == 0 ? dp[0] + dp[1] + 1 : 0;for (int i = 3; i < n; i++) {if (arr[i] == 1) {dp[i % 3] = 0;} else {dp[i % 3] = (dp[(i - 1) % 3] % 1000000007 + dp[(i - 2) % 3] % 1000000007 + dp[(i - 3) % 3] % 1000000007) % 1000000007;}}return dp[(n - 1) % 3];}
}

三、利用滚动数组继续优化arr数组

介于方法二,仅利用滚动数组优化dp数组的话,最后一个测试点还是内存超限,那么我继续利用滚动数组优化arr数组,极大的降低了空间复杂度,但时间复杂度也相应的增大了,但是不影响AC

,所有测试点全部可以通过。

package com.study.蓝桥杯.算法训练;import java.util.Scanner;/*** @author sjn* @date 2022-2-22*/public class ALGO_965进击的青蛙 {static long[] dp = new long[3];public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int[] arr = new int[3];long res = 0;for (int i = 0; i < N; i++) {arr[i % 3] = sc.nextInt();if (i == 2) {//第一轮输入,应该对dp数组进行初始化dp[0] = arr[0] == 0 ? 1 : 0;dp[1] = arr[1] == 0 ? dp[0] + 1 : 0;dp[2] = arr[2] == 0 ? dp[0] + dp[1] + 1 : 0;} else if (i % 3 == 2 || i == N - 1) {//每一轮输入都要调用dp方法,以达到滚动数组优化arr数组的目的,极大的降低了空间复杂度res = dp(arr, N);}}if (res == 0) {System.out.println("No Way!");} else {System.out.println(res);}}/*** * @param arr   存放数据的数组,长度为3* @param n     数据的总长度* @return      跳到末端的总方法数*/public static long dp(int[] arr, int n) {for (int i = 0; i < 3; i++) {if (arr[i] == 1) {dp[i % 3] = 0;} else {dp[i % 3] = (dp[0] % 1000000007 + dp[1] % 1000000007 + dp[2] % 1000000007) % 1000000007;}}return dp[(n - 1) % 3];}
}

蓝桥杯——算法训练——进击的青蛙相关推荐

  1. 试题 算法训练 进击的青蛙

    问题描述 青蛙X正准备跳过一座桥,这座桥被划分为N段,记青蛙所在的起始点为0,桥的末端为N.桥上的一些点有一些石子,这些点是无法跳上去的.青蛙每次跳跃能向前跳跃+1,+2,+3段,现在请你算出跳到末端 ...

  2. 蓝桥杯 算法训练 幸运的店家

    蓝桥杯 算法训练 幸运的店家 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 炫炫开了一家商店,卖的货只有一个,XXX,XXX卖N元钱.有趣的是,世界上只有面值为3的幂的纸 ...

  3. 蓝桥杯 算法训练 Beaver's Calculator

    蓝桥杯 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...

  4. 蓝桥杯 算法训练 印章

    蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...

  5. 蓝桥杯算法训练-24点(Python)

    问题描述 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24, ...

  6. 蓝桥杯——算法训练——数字三角形

    蓝桥杯--算法训练--数字三角形 这道题不难,但是比较典型,可以作为动态规划(dp)的入门篇,属于线性dp(LIS,LCS和数字三角形都是此类题型). ------------------------ ...

  7. 蓝桥杯算法训练-强力党逗志芃

    持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀 题目 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 ...

  8. 蓝桥杯 算法训练 逗志芃的危机

    蓝桥杯 算法训练 逗志芃的危机 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃又一次面临了危机.逗志芃的妹子是个聪明绝顶的人,相比之下逗志芃就很菜了.现在她妹子要和 ...

  9. 蓝桥杯算法训练-过河马

    蓝桥杯算法训练题解有兴趣的可以支持下. 题目 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后,这匹马表示它不开心了-- 于是,终于有一天,它也过河了! 由于过河马积累了许多的怨念 ...

最新文章

  1. CV领域中的Bert,了解一下?
  2. 打好网约车“安全牌”,T3出行以人、车、路保障
  3. 思考: 什么时候需要disable MMU/i-cache/d-cache?
  4. bfs广度优先搜索算法_图的广度优先搜索(BFS)
  5. java参数后面跟三个点是什么意思
  6. POJ 1804 Brainman (归并排序 -- 求逆序对数)
  7. (三)云计算技术学习--OpenStack之KeyStone
  8. html640设计稿,移动设备分辨率(终于弄懂了为什么移动端设计稿总是640px和750px)...
  9. 国内主要Android应用市场包名大全
  10. R语言—Shiny框架
  11. 自动白平衡也即:color constancy (色彩恒常)研究总结
  12. antd 动态自定义表单验证失效
  13. mysql分页查询出租房屋信息_分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)...
  14. 常用的sql语句,sql使用大全
  15. MAC删除多余的声音驱动文件
  16. 拒绝校园欺凌丨盐城北大青鸟机电基地开展法制宣传讲座
  17. 文都教育2022考研真题解析暨复试备考指导直播峰会圆满落幕
  18. Memory Compiler
  19. UE4如何使用Left Shift+W增加移动速度
  20. k8s部署nginx例子

热门文章

  1. 汇编语言:MOVSB,MOVSW,MOVSD
  2. 考研日记-7.28 一念之间
  3. 内存不良引起开机风扇间歇停转
  4. “医疗大数据”的三重困境
  5. moos-ivp 下载编译运行
  6. python(三):概念、语法、数据类型
  7. exp 函数的数值计算方法
  8. 冰点还原2023中文版最新电脑系统数据恢复软件
  9. 仿Windows记事本简要分析 (Java)
  10. curl shell 失败_Shell常用命令之curl