动态规划(二)

LeetCode63不同路径二(动态规划) 算法特点及适用场景该算法基于动态规划思想,针对存在障碍物的网格路径问题进行了合理的状态定义和状态转移方程推导,能够有效地计算出从左上角走到右下角的不同路径数量(考虑障碍物情况)。代码实现上在原 “不同路径” 问题的基础上增加了障碍物的相关判断逻辑,整体依然比较清晰直观,易于理解和维护。适用于各种类似在有障碍的地图、棋盘等场景中进行路径规划或者路径数量统计的问题,只要问题可以抽象成在二维平面上按照特定规则移动并统计路径的情况,都可以尝试运用这种动态规划结合障碍物判断的思路来求解。注意事项及可能遇到的问题。 阅读详情

一、矩阵的最小路径和

给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param matrix int整型二维数组 the matrix
     * @return int整型
     */
    public int minPathSum (int[][] matrix) {
        // write code here
        // dp[i][j]表示走到(i,j)位置时的最小路径和
        // dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + matrix[i][j]
        int n = matrix.length;
        int m = matrix[0].length;
        int[][] dp = new int[n][m];
        dp[0][0] = matrix[0][0];
        for (int i = 1; i < m; i++) {
            dp[0][i] = dp[0][i - 1] + matrix[0][i];
        }
        for (int i = 1; i < n; i++) {
            dp[i][0] = dp[i - 1][0] + matrix[i][0];
        }
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + matrix[i][j];
            }
        }
        return dp[n - 1][m - 1];
    }
}

运行结果

二、把数字翻译成字符串

有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。

现在给一串数字,返回有多少种可能的译码结果

数据范围:字符串长度满足 0<n≤90

进阶:空间复杂度 O(n),时间复杂度 O(n)

import java.util.*;


public class Solution {
    public int solve(String nums) {
        int dp0 = 1, dp1 = 1, pre = 3;
        for (char c : nums.toCharArray()) {
            // 一位数
            int num1 = c - '0';
            // 两位数
            int num2 = num1 + pre * 10;
            int next = 0;
            if (num2 >= 10 && num2 <= 26) {
                next += dp0;
            }
            if (num1 >= 1 && num1 <= 9) {
                next += dp1;
            }
            dp0 = dp1;
            dp1 = next;
            pre = c - '0';
        }
        return dp1;
    }
}

运行结果

三、兑换零钱

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。

如果无解,请返回-1.

数据范围:数组大小满足 0≤n≤100000 , 数组中每个数字都满足 0<val≤10000,0≤aim≤5000

要求:时间复杂度 O(n×aim),空间复杂度 O(aim)。

import java.util.*;

public class Solution {
    public int minMoney (int[] arr, int aim) {
        int[] dp = new int[aim +
                           1]; // dp数组记录每一个目标金额,对应的最小找零数
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;

        for (int i = 1; i <= aim; i++) {
            for (int money : arr) {
                if (i >= money && dp[i - money] != Integer.MAX_VALUE) {
                    dp[i] = Math.min(dp[i - money] + 1, dp[i]);
                }
            }
        }

        return dp[aim] == Integer.MAX_VALUE ? -1 : dp[aim];
    }
}

运行结果

四、最长上升子序列

给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。

所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。但 [1,6]、[1,3,5] 则不是它的子序列。

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 给定数组的最长严格上升子序列的长度。
     * @param arr int整型一维数组 给定的数组
     * @return int整型
     */
    public int LIS (int[] arr) {
        int n = arr.length;
        if (n == 0) {
            return 0;
        }
        int[] dp = new int[n + 1];
        int res = 1;

        for (int i = 1; i <= n; i++) {
            dp[i] = 1;
            for (int j = i - 1; j > 0; j--) {
                if (arr[i - 1] > arr[j - 1]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}

运行结果

五、连续子数组的最大和

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param array int整型一维数组
     * @return int整型
     */
    public int FindGreatestSumOfSubArray (int[] array) {
        // write code here
        int n = array.length;
        int sum = -101;
        int tmp = 0;
        for (int i = 0; i < n; i++) {
            tmp += array[i];
            if (tmp < array[i]) {
                tmp = array[i];
            }
            sum = Math.max(sum, tmp);
        }
        return sum;
    }
}

运行结果

六、最长回文子串

对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param A string字符串
     * @return int整型
     */
    public int getLongestPalindrome (String A) {
        // write code here
        int n = A.length();
        int res = 1;
        for (int i = 0; i < n; i++) {
            int left = i;
            int right = i;
            while (left >= 0 && right < n) {
                if (A.charAt(left) == A.charAt(right)) {
                    res = Math.max(right - left + 1, res);
                    left--;
                    right++;
                } else {
                    break;
                }
            }
            left = i;
            right = i + 1;
            while (left >= 0 && right < n) {
                if (A.charAt(left) == A.charAt(right)) {
                    res = Math.max(right - left + 1, res);
                    left--;
                    right++;
                } else {
                    break;
                }
            }
        }
        return res;
    }
}

运行结果

MOS管热阻的测量方法 实验室内如何测试mos管热阻 阅读详情

相关推荐

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2681

牛客-兑换零钱

题目 描述 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。 如果无解,请返回-1. 数据范围:数组大小满足 0≤n≤10000 , 数组中每个数字都满足 0<val≤10000,0≤aim≤5000 要求:时间复杂度 O(n×aim) ,空间复杂度 O(aim)。 思路 采用动态规划的思路一步步走,要凑到11块钱,考虑凑11-1 11-2 11-5块需要多少个硬币。 代码 pyth

weixin_41803339的博客 376

第六节 旅烨cms实战练习 -2021.03.11

第六节 旅烨cms实战练习 -2021.03.11 前期使用win10里小皮搭建旅烨cms,以为自己的各项配置有问题,但是小皮能够正常带动DVWA,始终带动不了旅烨cms。 后来与其他安全人员交流,发现win7可以正常运行旅烨cms。 所以目前为何出现问题尚不清楚 1.环境搭建 win7+小皮 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOSTEFUw-1615475228402)(C:\Users\LuXian\AppData\Roaming\Typora\typora

lyx3429的博客 573

​文章目录前言一、BM70 兑换零钱(一)题目描述题目解析二、BM71 最长上升子序列

一、BM70 兑换零钱(一)题目描述描述:给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1.示例1:示例2:示例3:备注:题目解析二、BM71 最长上升子序列(一)题目描述描述:给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。

未央的博客哟 479

Go-zero微服务实战:从零搭建电商用户系统(含完整代码示例)

本文详细介绍了如何使用go-zero框架从零搭建电商用户系统,包含完整的微服务架构设计、核心功能实现代码示例以及性能优化策略。通过分层架构设计、JWT认证、分布式锁等关键技术,实现高并发、高可用的用户系统,适用于电商平台开发。

weixin_29275257的博客 257

4. PCIe 接口时序

在上一篇中,大致介绍IPcore接口。总的来说接口如下图数据的接收和发送通过transmitTLPinterface和ReceiveTLPinterface。收发数据的时序也只是描述这几个接口的关系。从手册上截取PCIex1的接口时序。

jjinl的专栏 6123

leetcode322:零钱兑换

leetcode322:零钱兑换 题目: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 思路:动态规划+背包问题; 定义一维数组nums,nums[i] 含义:凑成总金额为i所需的最少硬币个数 代码如下: class Solution { int INF = 0x3f3f3f3f;

immortalize的博客 3060

向量化和向量数据库的开发步骤,以及本地docker下载Redis-stack-server,以及如何将文本转成向量,以及文本向量化成功后将数据存入到Redis-stack-server这个向量数据库

内存可以作为向量数据库,但是一重启一断电数据就没了这了选择RedisStack作为向量数据,用来向量的存储,未来会改名成Redis8,也就是在原本的Reids的功能上增加了新的特性,本质上还是Redis向量数据库还可以用ElaticSearch、MongoDB等。

qq_61723836的博客 1082

LeetCode题解:518. 零钱兑换 II,动态规划,JavaScript,详细注释

原题链接:518. 零钱兑换 II 解题思路: 假设输入: amount = 5, coins = [1, 2, 5],如果用长度为amount + 1的dp数组递推,需要满足如下特性: 如果用长度为amount + 1的dp数组递推。 每个索引代表了递推到的金额。 每个元素是硬币组合数。 0位置是初始状态,设置为1,表示都从1种组合数开始递推。 我们可以将其按照硬币种类拆分递推结果: 硬币1:[1,1,1,1,1,1] 硬币2:[1,0,1,0,1,0] 硬币5:[1,0,0,0,0,1]

Lee Chen的博客 4988

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1923

FPGA/IC 秋招笔试/面试题总结(目录)

FPGA/IC 秋招笔试/面试题总结-目录介绍 文章目录FPGA/IC 秋招笔试/面试题总结-目录介绍一、FPGA内部资源1. 什么是FPGA2.FPGA内部资源二、同步时钟、同步/异步电路1.同步时钟2.同步/异步电路三、同步复位/异步复位1.同步复位2. 异步复位3. 异步复位同步释放四、同步FIFO/异步FIFO1.同步FIFO2.异步FIFO五、FIFO最小深度计算1.FIFO最小深度2.示例分析六、逻辑电平1.TTL电平标准2.LVTTL电平标准3.CMOS电平标准4.LVCOMS电平标准5.RS

Crazzy_M的博客 2万+

python实现硬币收集问题

python算法问题

qq_52553510的博客 1059

基于Simulink的加速度计振动分析:单自由度质量-弹簧-阻尼系统

摘要:基于Simulink的加速度计单自由度振动分析 本文研究了加速度计的单自由度(SDOF)质量-弹簧-阻尼系统模型,通过MATLAB/Simulink平台建立了完整的振动分析仿真系统。文章详细阐述了理论建模过程,推导了系统运动微分方程和传递函数,并提供了Simulink模型搭建的具体步骤和MATLAB实现代码。研究通过正弦扫频、随机振动和冲击响应三种典型输入信号,分析了系统的幅频特性、相频特性及时域响应,验证了加速度计的工作机理。仿真结果表明,该方法能有效模拟加速度计在不同激励条件下的动态特性,为传感器

AI的内部世界的博客 163

力扣hot100二刷——动态规划

第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。

weixin_49426115的博客 974

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

力扣hot100二刷——多维动态规划、技巧(完结)

第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。

weixin_49426115的博客 447

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【动态规划-BM79 打家劫舍(二)】

【动态规划-BM79 打家劫舍(二)】

Youkiup的博客 450

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

算法 - 动态规划(二)

动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题, 然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。动态规划算法将问题的解决方案视为一系列决策的结果。题目描述:假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益。 1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能

zt_9773的博客 1033

动态规划-背包问题(二)

该题是lintcode上的算法题,该题的解题思路是按照九章侯老师给的方法去实现的。

天使之翼 672

动态规划 算法(二)

摘要 LeetCode 53题要求寻找数组中连续子数组的最大和。采用动态规划方法,定义dp[i]为以nums[i]结尾的最大子数组和,通过状态转移方程dp[i] = max(nums[i], dp[i-1]+nums[i])求解,空间优化后只需O(1)空间。152题扩展为求最大乘积子数组,需同时维护最大和最小乘积数组,处理负负得正的情况。典型示例中,数组[-2,1,-3,4,-1,2,1,-5,4]的最大子数组和为6,对应子数组[4,-1,2,1]。两题均采用动态规划,时间复杂度O(n),核心在于状态转移逻

红血哥 1572

二刷代码随想录——动态规划day38

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!

qq_43264167的博客 482

动态规划小总结(二)

动态规划题目的第二弹

m0_68519894的博客 519

每日一LeetCode:打家劫舍(二)(动态规划)

你是一个经验丰富的小偷,准备偷沿湖的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家,如果偷了第二家,那么就不能偷第一家和第三家。数据范围:数组长度满足 1≤n≤2×105 1≤n≤2×105 ,数组中每个值满足 1≤nums[i]≤5000 1≤nums[i]≤5000。给定一个长度为n的整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。

三木的博客 350

二刷代码随想录——动态规划day47

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!

qq_43264167的博客 550

实验二 动态规划

实验二 动态规划 一、 实验目的及任务 1、 掌握动态规划算法的基本步骤:找出最优解的性质,并刻画其结构特征;递归地定义最优值;以自底向上的方式计算出最优值;根据计算最优值时得到的信息,构造最优解。 2、 设计并实现矩阵连乘的算法,掌握动态规划算法。 二、 实验环境 c++或java或Turbo c 三、 问题描述 给定n个矩阵,其中Ai与Ai+1是可乘的,i=1,2…,n。 矩阵 Ai 的维度为 P i-1´ Pi,如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要

zlhnp的博客 220

代码随想录二刷|动态规划3

动态规划数组的含义 dp[i]递推公式动态规划数组的初始化确定遍历顺序手动模拟验证。

2301_79647020的博客 1154

算法实验二 动态规划

动态规划1 实验题目:减肥的小K2 题目描述: 小K是个苦命的孩子,他的师傅为了多赚钱,以减肥为理由,让他去采药,并说不完成不能吃饭。野地里有许多不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。要求在规定的时间t里,采到的草药的总价值最大。 输入要求: 第一行有2个整数T(1≤T≤1000)和M(1≤M≤100),一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。 接下来的M行每行包括两个在1到100之间包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。 输

weixin_45816954的博客 2789
上一篇: 动态规划(一)
下一篇: 动态规划(三)
w_zero_one
博客等级 码龄2年 149粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值