算法练习:动态规划

实验题目:最少硬币问题 实验目的: 练习动态规划算法 动态规划 最少硬币问题 [实验目的] 练习动态规划算法 [实验题目] 设有 n 种不同面值的硬币,各硬币的面值存于数组 T[1:n]中。现要用这些 面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组 Coins[1:n]中。 对任意钱数 0≤m≤20001,设计一个用最少硬币找钱 m 的方法。 #include <stdio.h> #include<string.h> #define MAX 20002 #define INF 9999999 #define min(a,b 阅读详情

从下面三道LeetCode的习题中分析简单的动态规划的思想

1.(LeetCode) 70.爬楼梯

题目描述:

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

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

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

题目分析:

这是一道基础的动态规划习题,也是在很多动态规划题目中很好理解的一个例子。

首先从题目的要求的结果出发,题目中要求爬到第n级台阶所需的方法。爬上楼梯的方法有两种,一种是一次爬一级台阶,一种是一次爬两级台阶。因此可以倒推出有两种方法可以到达最后一级台阶,即从n-1级楼梯迈一步上去,另一种是从n-2级楼梯迈两步上去。即 (到达n级楼梯的可能性)=(到达n-1级楼梯的可能性)+(到达n-2级楼梯的可能性)。然后问题就变成了求两个子问题的解,一步步倒推,倒推到已经解:即到达第一级楼梯只有一种方法,到达第二级楼梯有两种方法。从这两个已知的解就能求出问题最后的解。

程序没有采用递归的形式,因为递归栈占用的内存空间太大,且时间效率也很不理想。我们注意到求到达n级楼梯只需知道它的下两级楼梯所需的方法数。因此在程序中设置了两个变量保存这两个值(下面两个题目也有类似的思想)。

算法代码: 

class Solution {
    public int climbStairs(int n) {
       if(n==1){    //楼梯只有一级时,方法数为1
           return 1;
       }
        else if(n==2){    //楼梯只有二级时,方法数为2
            return 2;
        }
        
        int a=1,b=2;    //a表示前两级楼梯的方法,b表示前一级楼梯的方法
        int temp=0;
       for(int i=3;i<=n;i++){
           temp=a+b;    //第i级阶梯的方法数为两者相加
           a=b;        //更新a
           b=temp;    //更新b
       }
        return temp;
    }
}

 

2.(LeetCode) 198.打家劫舍

题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

题目分析:

因为不能盗窃相邻房屋内的物品,即不能将数组相邻的两个值相加。程序中设置了一个choose数组,choose[i]表示盗取前i个房屋的最大金额,choose[arr.length]即为盗取金额的最大值,要使盗取的金额最大,要么就放弃盗窃这家,保持与前一个房屋盗取的总金额,要么就是取前一个的前一个的房屋的金额加上要盗取的房屋的金额(因为两者不相邻),在这两个选择间取最大值。

动态规划的递推方程为:choose[i]=Math.max(choose[i-1],choose[i-2]+arr[i]);

算法代码:

class Solution {
    public int rob(int[] nums) {
        
        if(nums.length==0){    //没有房屋,金额为0
            return 0;
        }
        if(nums.length==1){    //只有一个房屋,取第一个为最大金额
            return nums[0];
        }
        if(nums.length==2){
            return Math.max(nums[0],nums[1]);    //两个房屋,取其中最大值
        }
        
        int[] choose=new int[nums.length];    //choose[i]为盗取前i个房屋时可以累积的最大金额
        choose[0]=nums[0];    
        choose[1]=Math.max(nums[0],nums[1]);
        
        for(int i=2;i<nums.length;i++){
            int a=choose[i-2]+nums[i];    //选择一,盗窃这家房屋,再加上前i-2房屋的总金额
            int b=choose[i-1];            //选择二,不盗取进入的这个房屋,取相邻的房屋的最大值
            choose[i]=Math.max(a,b);    //在两个选择中取一个最大的
        }
        return choose[nums.length-1];    //choose数组的末尾就是遍历了整个数组的最大金额
        
    }
}

 

3.(LeetCode) 121.买卖股票的最佳时机

题目描述:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

题目分析:

这道题目不用动态规划的思想或许会更简单,但这里还是阐述一下动态规划来解决这道题目的思想

要使股票卖出最大价格,一个选择自然是在第n天不进行任何买进或者卖出的操作,此时的最大利润为前一天的最大利润。第二个选择是若当天的股票价格极高,可以选择在这个时候卖出,这时候的最大收益就和前一天的最大利润没有任何关系了,此时的最大利润为当天的价格-在当天之前的最低价格(理解为在这个价格最低的时候买进)。因此动态规划的递推方程为:

前i天的最大收益=Math.max(前i-1天的最大收益,当天的价格-前i天的最低价格);

算法代码:

class Solution {
   public  int maxProfit(int[] prices) {
        if(prices == null || prices.length == 0) {  //数组不存在或长度为0
            return 0;
        } 
       int profit = 0;  //前i天的最大收益
       int min = prices[0]; //min记录的是前i天的最低价格
       for(int i = 1; i < prices.length; i++){
          profit = Math.max(profit, prices[i] - min);   //最大收益在两个选择间
          if(min > prices[i]) {
              min = prices[i];  //每次循环都更新min的值,确保min是前i天最小的值
          }
       }
       return profit;
    }
}

 

算法练习:动态规划,礼物最大值 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? 示例 1: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 12 解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物 提示: 关于动态规划解题套路参考https://labuladong.git... 阅读详情

相关推荐

硬币找零动态规划C语言实现

一个简单的动态规划算法实例,实现硬币找零的最小硬币数以及每种面额硬币的数量。

贪心算法--月饼

贪心法是求解一类最优化问题的方法,它总是考虑在当前状态下局部最优(或较优)的策略,来使全局的结果达到最优(或较优)。 算法描述: 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现定所有种类月饼的库存量、总售价以及市场的最大需求量,试计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如有三种月饼,其库存量分别为18、15、10万...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 2838

CamoFox MCP:让AI助手隐身操作浏览器的反检测自动化实战

浏览器自动化是提升工作效率和实现数据采集的关键技术,其核心原理在于通过程序脚本模拟人类在网页上的交互行为。传统方案如Selenium或Playwright虽功能强大,但需要开发者编写复杂脚本并处理反爬机制。随着AI Agent技术的发展,自然语言驱动的自动化成为新趋势,它能将任务规划与逻辑判断交由AI处理,大幅降低使用门槛。Model Context Protocol(MCP)作为连接AI与外部工具的标准协议,在此场景下价值凸显,它使得AI助手能直接调用丰富的浏览器操作工具。CamoFox MCP创新性地将

weixin_42551967的博客 726

动态规划算法总结

1、股票最大利润问题 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 class Solution { public int maxProfit(int[] prices) { in

ma19560127的博客 306

深入解析璞致PZ-ZU47DR RFSoC核心板:硬件架构与多通道ADC/DAC设计实战

本文深入解析璞致PZ-ZU47DR RFSoC核心板的硬件架构与多通道ADC/DAC设计实战。作为Xilinx Zynq UltraScale+ RFSoC系列的代表产品,PZ-ZU47DR集成了8通道5GSPS ADC和8通道9.85GSPS DAC,支持直接射频采样,大幅简化射频链路设计。文章详细介绍了其技术优势、设计挑战及实战技巧,为5G小基站、毫米波等应用场景提供高效解决方案。

meat5的博客 834

STM32 IAP跳转后APP卡死?别慌,手把手教你修复HAL_RCC_OscConfig时钟配置冲突

本文深入分析了STM32 IAP跳转后APP在HAL_RCC_OscConfig函数中卡死的问题,揭示了PLL时钟配置冲突的根本原因。通过详细的代码示例和分步解决方案,指导开发者正确处理STM32F1/F4系列的时钟系统二次初始化问题,确保IAP+APP架构的稳定运行。

weixin_28685287的博客 365

数据结构与算法---动态规划---礼物的最大价值、买卖股票的最佳时期

礼物的最大价值 47. 礼物的最大价值 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? 示例 1: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 12 解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物 提示: 0 < grid.length <= 2

IOSSHAN的博客 420

金蝶云星空应用开发初级考试题目汇总

摘要:本文为金蝶云星空应用开发初级考试题目汇总

2401_86113757的博客 3799

PTA1020 月饼 (25 分)

//测试点3所有库存总和小于我的需求量 #include<stdio.h> #include<stdlib.h> typedef struct { double s,a,b; }thing; thing it[1001]; int cmp(const void *a,const void *b) { return ((thing *)b)->s>((thing *)a)->s; } void main() { int i; in.

糖糖的博客 245

STM32F103+AX58100 EtherCAT从站SPI移植实战:CubeMX配置避坑指南

本文详细介绍了STM32F103与AX58100 EtherCAT从站控制器的SPI接口移植实战,重点解析CubeMX配置中的关键参数与常见陷阱。内容涵盖硬件连接规范、SPI模式设置、中断优先级规划及协议栈对接技巧,帮助开发者高效实现工业自动化领域的实时通信方案。特别强调CPOL/CPHA配置与AX58100的匹配要求,避免数据错位问题。

weixin_29230865的博客 331

PX4飞控与MAVROS实战:从零搭建无人机ROS通信环境(附常见报错解决)

本文详细介绍了如何从零搭建PX4飞控与ROS的通信环境,重点解析了MAVROS的安装、硬件连接、串口权限配置以及坐标系转换等核心步骤。针对GeographicLib数据下载失败、串口权限不足等常见报错提供了实用解决方案,并附有Offboard模式控制的代码示例,帮助开发者快速建立稳定的无人机ROS开发环境。

dapp9builder的博客 335

PAT (Basic Level) Practice (中文)1020 月饼 (25分)(C语言版)

1020月饼(25分) 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 ..

染指流年的博客 394

安装部署 Guacamole 远程桌面网关

Guacamole 是Apache基金会提供的一组基于web的远程桌面访问工具,支持 VNC、RDP、SSH、 Telnet 等协议,支持远程透传音视频。

UsamaBinLaden6976498的专栏 1963

实验四:算法综合练习(动态规划算法)

实验四:算法综合练习 第一次写博客,写的不好,大家如果觉得有用就三连一下/手动狗头 实验目的:掌握回溯算法的设计思想、具体实现和时间复杂度分析。同时复习动态规划算法、贪心算法。 实验要求:分别用伪代码或流程图或步骤分析图描述利用动态规划、贪心策略、回溯法的算法解决方案,再用程序实现,计算时间复杂度,记录最终测试数据和测试结果,运行时间。 旅行商问题 问题描述:给定一个的整数矩阵,你要写一个程序来计算出最小权值。一条路径从列1(第一列)的任意位置开始,包括一系列的移动,最终抵达列(最后一列)。每一步均由列到列

weixin_43939241的博客 808

基于STM32L4XX、HAL库的YT8531C-CA以太网收发器(PHY)驱动程序设计

是一款由裕太微推出的高性价比、低功耗的单端口 10/100M 以太网物理层收发器(PHY)。它通过标准的 MII(介质独立接口)或 RMII(精简介质独立接口)与微控制器的 MAC 层连接,实现将数字信号与网络模拟信号之间的转换。支持自动协商(Auto-Negotiation),自动选择最高速率和双工模式。支持 HP Auto-MDIX(自动交叉直连),无需区分直通线或交叉线。低功耗设计,特别适合电池供电或对功耗敏感的 STM32L4 应用。支持 MII 和 RMII 接口,节省引脚(RMII模式)。

zhusl6688的博客 628

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

动态规划算法:从理论理解到实战练习的跨越

在这个问题中,状态定义为凑出金额n所需的最少硬币数,状态转移方程为dp[n] = min(dp[n], dp[n - coin] + 1),遍历每种硬币面额更新dp数组。例如经典的斐波那契数列问题,其定义为:F(n) = F(n - 1) + F(n - 2),F(0) = 0,F(1) = 1。在背包问题里,状态转移方程为:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]),表示放入第i个物品和不放入第i个物品两种情况下的最大价值。

mingzhuo5432的博客 333

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

动态规划算法:在练习中培养高效的思考习惯

对于一般情况,若s[i]等于s[j],则dp[i][j]取决于dp[i + 1][j - 1]。以“不同路径”问题为例,在一个m×n的网格中,机器人从左上角移动到右下角,每次只能向下或向右移动一步,求路径总数。以“0-1背包”问题为例,常规解法使用二维数组dp[i][j]记录状态,空间复杂度为O(mn),其中m为物品数量,n为背包容量。在动态规划练习中,通过深入分析问题、有序构建思路、积极优化解法并不断总结归纳,逐步培养高效思考习惯,从而熟练运用这一强大算法,攻克各种复杂问题。

mingzhuo5432的博客 168

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法练习:动态规划01背包

备考考研复试,初试,408专业课的学习,或者是准备参加复试算法突击的小伙伴可以滴滴我哈,备注算法哦!题目转载Leetcode。

HKLPS_354651720的博客 555

深度剖析动态规划算法:解题思路与练习技巧

对于计算 A_iA_{i + 1}\cdots A_j 的最优计算顺序,它的最优解包含了子问题 A_iA_{i + 1}\cdots A_k 和 A_{k + 1}A_{k + 2}\cdots A_j(i \leq k \lt j)的最优解。在练习动态规划时,从像爬楼梯这样的简单问题开始是很有效的方法。这个问题的状态很容易定义,设 dp[n] 表示爬到第 n 级台阶的方法数,状态转移方程为 dp[n] = dp[n - 1] + dp[n - 2],初始条件为 dp[1] = 1,dp[2] = 2。

mingzhuo5432的博客 387

算法练习篇之:斐波那契数列(数组,动态规划)

算法练习篇之:斐波那契数列(数组,动态规划)题目描述解题思路代码实现总结 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39 解题思路 斐波那契数列定义: f(n) = n, (n <= 1) f(n) = f(n-1) + f(n-2), (n > 1) 递归的思路非常简洁,但是很容易会出现stac...

香农三定律的博客 668

算法练习:从暴力递归到动态规划3

从暴力递归到动态规划3(背包问题)

superzheng__的博客 154

算法练习:从暴力递归到动态规划4

算法练习:从暴力递归到动态规划4

superzheng__的博客 161

算法练习:从暴力递归到动态规划2

算法练习:从暴力递归到动态规划2

superzheng__的博客 176

算法练习:从暴力递归到动态规划1

算法练习:从暴力递归到动态规划1

superzheng__的博客 238

UCAS算法课后练习2:LCS动态规划详解

给定两个序列X和Y,找到它们共有的最长子序列的长度。子序列不要求连续,但必须保持原始顺序。例如,X = "ABCBDAB",Y = "BDCABA",LCS为"BCBA"或"BDAB"。

QPt_slva的博客 311
下一篇: (LeetCode)使用最小花费爬楼梯
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值