【冲击蓝桥篇】动态规划(下):你还在怕动态规划!?进来!答题模板+思路解析+真题实战

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【冲击蓝桥篇】动态规划(下):你还在怕动态规划!?进来!答题模板+思路解析+真题实战

上篇主要是刷了两道真题(接龙数组和蜗牛 都是蓝桥杯2023的真题)有兴趣可以看看这个http://t.csdnimg.cn/AM9c2


动态规划(Dynamic Programming)常常是蓝桥杯的常见考点 拿下他能够为比赛拉开不少的差距 于是专门开了两篇来写这个 这一篇主要是分析思想为主  分享遇到这类题要怎样去思考


动态规划的实现通常包括以下几个步骤:


  1. 定义问题的状态:将原问题划分为若干个子问题,同时定义每个子问题的状态。状态可以是原问题的某个维度的变量,如数组的索引、字符串的长度等。
  2. 确定状态转移方程:分析子问题之间的关系,找出状态之间的转移关系。这可以通过观察问题的特点和递推关系来得到。状态转移方程描述了如何根据已知状态计算下一个状态的值。
  3. 初始化边界状态:确定最简单的子问题的解,也就是边界状态的值。通常需要将边界状态的值预先计算或初始化为已知的值。
  4. 通过迭代计算:根据状态转移方程和边界状态,通过迭代计算解决子问题,并将中间结果存储起来。这样,在计算后续子问题时,可以直接利用已计算的结果,避免重复计算。
  5. 求解原问题:根据子问题的解,通过状态转移方程得到原问题的解。


下面以一个经典的动态规划问题——「爬楼梯」为例进行说明:


问题描述:假设有一个n级的楼梯,每次可以爬1级或2级,求解爬到第n级楼梯的不同爬法总数。


分析思想:


  • 定义状态:令dp[i]表示爬到第i级楼梯的不同爬法总数。
  • 状态转移方程:由于每次可以爬1级或2级,那么爬到第i级楼梯的爬法总数等于爬到第(i-1)级楼梯的爬法总数加上爬到第(i-2)级楼梯的爬法总数,即dp[i] = dp[i-1] + dp[i-2]。
  • 边界状态:当楼梯级数为1时,只有一种爬法;当楼梯级数为2时,有两种爬法。即dp[1] = 1,dp[2] = 2。
  • 迭代计算:根据状态转移方程和边界状态,通过迭代计算dp数组的值,从dp[3]开始计算,一直计算到dp[n]。
  • 求解原问题:最终得到dp[n]即为爬到第n级楼梯的不同爬法总数。


这个事情就非常简单了 只需要把你的思想用代码实现就好了

public class ClimbingStairs {
    public static int climbStairs(int n) {
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
 
    public static void main(String[] args) {
        int n = 4;
        int ways = climbStairs(n);
        System.out.println("The number of distinct ways to climb " + n + " stairs is: " + ways);
    }
}

下面分享一下我这段时间刷题总结出来的模板 如有失误请在评论区指出哦


一维动态规划

int n = ...; // 输入规模
int[] dp = new int[n]; // 初始化状态数组
dp[0] = ...; // 初始化边界条件
for (int i = 1; i < n; i++) {
    // 状态转移方程
    dp[i] = ...;
}
return dp[n-1]; // 返回最终结果

这种模板适用于一维动态规划问题,其中 dp[i] 表示第 i 个状态的值。通过迭代计算并更新每个状态的值,最终得到最优解。


二维动态规划

int m = ...; // 第一个维度的大小
int n = ...; // 第二个维度的大小
int[][] dp = new int[m][n]; // 初始化状态数组
dp[0][0] = ...; // 初始化边界条件
for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        // 状态转移方程
        dp[i][j] = ...;
    }
}
return dp[m-1][n-1]; // 返回最终结果

这种模板适用于二维动态规划问题,其中 dp[i][j] 表示第 (i, j) 个状态的值。通过嵌套循环迭代计算并更新每个状态的值,最终得到最优解。


动态背包

int n = ...; // 物品数量
int W = ...; // 背包容量
int[] weights = ...; // 物品重量数组
int[] values = ...; // 物品价值数组
int[][] dp = new int[n+1][W+1]; // 初始化状态数组
for (int i = 1; i <= n; i++) {
    int weight = weights[i-1];
    int value = values[i-1];
    for (int j = 1; j <= W; j++) {
        if (j < weight) {
            dp[i][j] = dp[i-1][j];
        } else {
            dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weight] + value);
        }
    }
}
return dp[n][W]; // 返回最终结果

这种模板适用于背包问题,其中 dp[i][j] 表示在前 i 个物品中选择,在背包容量为 j 的情况下的最大价值。通过嵌套循环迭代计算并更新每个状态的值,最终得到背包能够装载的最大价值。


举一反三动态背包 思想总结


这类应用于一类优化问题,其中需要在给定的一组选择中做出最优决策,以获得最大的收益或最小的成本可以通过以下步骤来思考和解决:


  1. 定义状态:首先,需要明确问题的状态。通常,状态与问题的限制条件有关。在动态背包问题中,状态可以定义为背包容量、可选择的物品、物品的数量等。


  1. 确定状态转移方程:接下来,需要找到状态之间的转移关系。也就是说,如何根据已知的状态来计算下一个状态。状态转移方程通常是通过观察问题的特点和约束条件得出的。


  1. 处理边界情况:在动态规划中,边界情况通常是最简单的子问题,其解是已知的或可以直接计算的。对于动态背包问题,边界情况可能是背包容量为0或没有物品可选时的情况。


  1. 填充状态表格:根据定义的状态和状态转移方程,可以创建一个二维表格或数组来存储中间结果。通过遍历状态表格并计算每个单元格的值,填充整个表格。


  1. 求解最优解:根据问题的要求,可以从状态表格中读取最优解。例如,如果问题要求最大价值,则可以在表格的右下角找到最大值。
相关文章
|
9天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
48 13
|
6天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
154 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
4天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
45 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
1天前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
18天前
|
数据采集 DataWorks 搜索推荐
阿里云DataWorks深度评测:实战视角下的全方位解析
在数字化转型的大潮中,高效的数据处理与分析成为企业竞争的关键。本文深入评测阿里云DataWorks,从用户画像分析最佳实践、产品体验、与竞品对比及Data Studio公测体验等多角度,全面解析其功能优势与优化空间,为企业提供宝贵参考。
97 13
|
15天前
|
数据采集 存储 JavaScript
网页爬虫技术全解析:从基础到实战
在信息爆炸的时代,网页爬虫作为数据采集的重要工具,已成为数据科学家、研究人员和开发者不可或缺的技术。本文全面解析网页爬虫的基础概念、工作原理、技术栈与工具,以及实战案例,探讨其合法性与道德问题,分享爬虫设计与实现的详细步骤,介绍优化与维护的方法,应对反爬虫机制、动态内容加载等挑战,旨在帮助读者深入理解并合理运用网页爬虫技术。
|
21天前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
1月前
|
自然语言处理 编译器 Linux
|
28天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
30 1
|
1月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####

热门文章

最新文章

推荐镜像

更多