力扣 656.金币路径
656.金币路径
给定一个数组
A
(下标从1
开始)包含 N 个整数:A1,A2,……,AN 和一个整数B
。你可以从数组A
中的任何一个位置(下标为i
)跳到下标i+1
,i+2
,……,i+B
的任意一个可以跳到的位置上。如果你在下标为i
的位置上,你需要支付 Ai 个金币。如果 Ai 是 -1,意味着下标为i
的位置是不可以跳到的。现在,你希望花费最少的金币从数组
A
的1
位置跳到N
位置,你需要输出花费最少的路径,依次输出所有经过的下标(从 1 到 N)。如果有多种花费最少的方案,输出字典顺序最小的路径。
如果无法到达 N 位置,请返回一个空数组。
样例 1 :
输入: [1,2,4,-1,2], 2 输出: [1,3,5]样例 2 :
输入: [1,2,4,-1,2], 1 输出: []注释 :
- 路径 Pa1,Pa2,……,Pan 是字典序小于 Pb1,Pb2,……,Pbm 的,当且仅当第一个 Pai 和 Pbi 不同的
i
满足 Pai < Pbi,如果不存在这样的i
那么满足n
<m
。- A1 >= 0。 A2, ..., AN (如果存在) 的范围是 [-1, 100]。
- A 数组的长度范围 [1, 1000].
- B 的范围 [1, 100].
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/coin-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题结果
写出,但是不太好,动态规划+DFS
方法:动态规划+DFS
1. 动态规划算出最小步数是几,记录每个节点
2. dfs查找字典序最小的结果
class Solution {public List<Integer> cheapestJump(int[] coins, int maxJump) {int n = coins.length;int[] minSpend = new int[n];Arrays.fill(minSpend,Integer.MAX_VALUE);minSpend[0] = coins[0];for(int i = 0; i < n-1; i++){if(minSpend[i]==Integer.MAX_VALUE) continue;for(int j = 1; j <= maxJump&&i+j<n; j++){if(coins[i+j]==-1) continue;minSpend[i+j] = Math.min(minSpend[i]+coins[i+j],minSpend[i+j]);}}if(minSpend[n-1]==Integer.MAX_VALUE) return ans;;test(minSpend,coins,new ArrayList<>(),n-1,maxJump);return ans;}List<Integer> ans = new ArrayList<>();private void test(int[] dp, int[] coins, List<Integer> curr,int pos,int maxJump){if(pos == 0){curr.add(1);Collections.reverse(curr);if(cmp(curr)<0)ans = new ArrayList<>(curr);Collections.reverse(curr);curr.remove(curr.size()-1);return;}curr.add(pos+1);int v = dp[pos]-coins[pos];for(int j = 1; j <= maxJump&&pos-j>=0; j++){if(dp[pos-j]==v) {test(dp,coins,curr,pos-j,maxJump);}}curr.remove(curr.size()-1);}private int cmp(List<Integer> curr){if(ans.isEmpty()) return -1;int s1 = ans.size();int s2 = curr.size();for(int i = 0; i < Math.min(s1,s2); i++){if(curr.get(i).compareTo(ans.get(i))!=0){return curr.get(i).compareTo(ans.get(i));}}return s2-s1;}}
力扣 656.金币路径相关推荐
- LeetCode 656. 金币路径(DP)
文章目录 1. 题目 2. 解题 1. 题目 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,--,AN 和一个整数 B. 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 ...
- leetcode力扣64. 最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5, ...
- leetcode力扣62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...
- 力扣62-不同路径(C++,留个思路)
思路: 动态规划类似于递归,就是发现大问题可以用小问题来做. 1.确定用动态规划 这个题怎么发现是动态规划的呢?首先想到0,1和1,0和1,1这三个位置,这三个位置最好看,前两个都是只走一步,1,1发 ...
- 2022-03-06:金币路径。 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,……,AN 和一个整数 B。 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+
2022-03-06:金币路径. 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,--,AN 和一个整数 B. 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+ ...
- 力扣刷题记录-动态规划问题总结
百度百科里对于动态规划问题是这样解释的: 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.因此各个阶段 ...
- 《LeetCode力扣练习》第64题 最小路径和 Java
<LeetCode力扣练习>第64题 最小路径和 Java 一.资源 题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为 ...
- 《LeetCode力扣练习》第62题 不同路径 Java
<LeetCode力扣练习>第62题 不同路径 Java 一.资源 题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). ...
- python【力扣LeetCode算法题库】257- 二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / 2 3 5 输出: ["1->2->5", &quo ...
最新文章
- 千万级并发!如何设计一个多级缓存系统?
- Web Application:Exploded和Web Application:Archive
- 最全三大框架整合(使用映射)——数据库资源文件jdbc.properties
- python逆序数怎么求_怎么算逆序数?急~~~!!!
- Tensorflow CNN(两层卷积+全连接+softmax)
- asp.net截取字符串方法
- c语言随机数表,C语言随机数
- 小型自动化运维--expect脚本之传递函数
- 分析华为毕昇JDK8:类数据共享CDS有效果,幅度很小
- unbuntu安装docker
- 计算机游戏玩法,123木头人游戏规则与玩法
- axios get怎么还会显示跨域_axios 跨域问题的解决 (接口 Phal 框架)
- 独立开发变现周刊(第41期):一个开源项目一个人每月收入8万美金
- 【Git常用】之回滚
- 2017年 第8届 蓝桥杯 Java B组 省赛真题详解及总结
- SEO关键词排名优化教程
- 【深度学习前沿应用】图像分类Fine-Tuning
- 粉象生活宇漫:贴吧引流实战教程
- 华为ensp,wireshark3.0.0,virtualbox 5.2.22 安装包
- cognos java_Cognos第三方用户认证(CustomJavaProvider)