当前位置: 首页 > wzjs >正文

安徽省建设安全监督站的网站兰州网络推广公司哪家好

安徽省建设安全监督站的网站,兰州网络推广公司哪家好,wordpress 双语言,做 从哪个网站上下载图片文章目录 基本思想适用条件最优子结构子问题重叠状态转移方程 解题步骤应用斐波那契数列背包问题最大子数组和 基本思想 动态规划的核心思想在于将一个复杂的问题分解为一系列相互关联的子问题,通过求解子问题并保存其解,避免对相同子问题的重复计算&am…

文章目录

    • 基本思想
    • 适用条件
      • 最优子结构
      • 子问题重叠
      • 状态转移方程
    • 解题步骤
    • 应用
      • 斐波那契数列
      • 背包问题
      • 最大子数组和

基本思想

动态规划的核心思想在于将一个复杂的问题分解为一系列相互关联的子问题,通过求解子问题并保存其解,避免对相同子问题的重复计算,从而提高算法的效率。具体来说,动态规划通常会利用已经解决的子问题的结果来推导出更大规模子问题的解,直至最终解决原问题。

适用条件

最优子结构

问题的最优解包含其子问题的最优解。也就是说,一个问题的最优解可以由其子问题的最优解组合而成。例如,在求解最短路径问题时,从起点到终点的最短路径必然包含从起点到中间某个节点的最短路径。

子问题重叠

在求解问题的过程中,会多次遇到相同的子问题。通过保存这些子问题的解,避免重复计算,从而提高算法的效率。例如,在斐波那契数列的计算中,计算较大的斐波那契数时会多次用到较小的斐波那契数。

状态转移方程

用于描述问题的状态和状态之间的关系,通过状态的转移得到最终问题的解。

解题步骤

定义状态:确定问题的状态表示,即如何用一个或多个变量来描述问题的子问题。状态的定义需要能够准确地刻画问题的特征,并且要满足最优子结构性质。

找出状态转移方程:根据问题的最优子结构性质,找出状态之间的递推关系,即如何从已知的子问题的解推导出当前问题的解。状态转移方程是动态规划算法的核心。

确定初始状态:找出问题的边界条件,即最简单的子问题的解。初始状态是递推的起点,后续的状态都是基于初始状态逐步推导出来的。

计算顺序:根据状态转移方程,确定状态的计算顺序。通常有两种计算顺序:自顶向下(记忆化搜索)和自底向上(迭代)。自顶向下方法从原问题出发,递归地求解子问题,并保存已经求解的子问题的解;自底向上方法则从初始状态开始,逐步计算出所有子问题的解,直到得到原问题的解。

返回结果:根据问题的要求,从计算得到的状态中提取出最终的解。

应用

斐波那契数列

 public class Fibonacci {public static int fibonacci(int n) {    if (n <= 1) return n;        int[] dp = new int[n + 1];       dp[0] = 0;        dp[1] = 1;        for (int i = 2; i <= n; i++) {            dp[i] = dp[i - 1] + dp[i - 2];       }        return dp[n];    }   public static void main(String[] args) {                       System.out.println(fibonacci(10));  }}
  • 子问题定义:定义 dp[i] 表示第 i 个斐波那契数。
  • 状态转移方程: dp[i] = dp[i - 1] + dp[i - 2] ,其中 i >= 2 , dp[0] = 0 , dp[1] = 1 。- 时间复杂度:使用了一个循环来计算 dp 数组的每个元素,循环次数为 n ,因此时间复杂度为 O(n) 。
  • 空间复杂度:使用了一个大小为 n + 1 的数组 dp 来存储子问题的解,所以空间复杂度为 O(n)。
  • 实际上,由于计算 dp[i] 时只需要 dp[i - 1] 和 dp[i - 2] 的值,我们可以进一步优化空间复杂度到 ,只使用两个变量来存储前两个斐波那契数。

背包问题

 public class Knapsack {public static int knapsack(int[] weights, int[] values, int capacity) {        int n = weights.length;        int[][] dp = new int[n + 1][capacity + 1];        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= capacity; j++) {                if (weights[i - 1] <= j) {                    dp[i][j] = Math.max(values[i - 1] + dp[i - 1][j - weights[i - 1]], dp[i - 1][j]);                } else {                    dp[i][j] = dp[i - 1][j];               }            }      }        return dp[n][capacity];    }    public static void main(String[] args) {        int[] weights = {2, 3, 4, 5};        int[] values = {3, 4, 5, 6};        int capacity = 8;        System.out.println(knapsack(weights, values, capacity));    }}
  • 子问题定义:定义 dp[i][j] 表示在前 i 个物品中选择,且背包容量为 j 时能获得的最大价值。
  • 状态转移方程:
    • 当 weights[i - 1] <= j 时(即第 i 个物品可以放入背包), dp[i][j] = Math.max(values[i - 1] + dp[i - 1][j - weights[i - 1]], dp[i - 1][j]) ,表示取放入第 i 个物品和不放入第 i 个物品两种情况的较大值。
    • 当 weights[i - 1] > j 时(即第 i 个物品放不下), dp[i][j] = dp[i - 1][j] ,即不放入第 i 个物品。
  • 时间复杂度:有两个嵌套的循环,外层循环遍历物品数量 n 次,内层循环遍历背包容量 capacity 次,所以时间复杂度为 O(n×capacity) 。
  • 空间复杂度:使用了一个二维数组 dp[n + 1][capacity + 1] 来存储子问题的解,因此空间复杂度为O(n×capacity) 。通过优化,可以将空间复杂度降低到 ,因为每次计算 dp[i][j] 时只依赖于 dp[i - 1][…] 的值。

最大子数组和

假设有一个数组 nums,求解其连续子数组的最大和

  • 定义状态: 设 dp[i] 为以 nums[i] 结尾的连续子数组的最大和。
  • 状态转移方程: dp[i] = max(dp[i-1] + nums[i], nums[i]),即当前位置的最大和要么是之前的最大和加上当前元素,要么是当前元素本身。
  • 初始化: dp[0] = nums[0],数组的第一个元素作为初始值。
  • 遍历: 从数组的第二个元素开始遍历,更新 dp[i]。
  • 最终结果: 最大的 dp[i] 即为所求。
public class MaxSubarraySum {public static int maxSubarraySum(int[] nums) {int n = nums.length;// 创建一个数组 dp 用于保存子问题的解int[] dp = new int[n];// 初始化 dp 数组的第一个元素dp[0] = nums[0];// 遍历数组,根据状态转移方程更新 dp 数组for (int i = 1; i < n; i++) {dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);}// 找出 dp 数组中的最大值int max = dp[0];for (int i = 1; i < n; i++) {if (dp[i] > max) {max = dp[i];}}return max;}public static void main(String[] args) {int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int result = maxSubarraySum(nums);System.out.println(result); // 输出 6,对应子数组 [4, -1, 2, 1]}
}
http://www.dtcms.com/wzjs/17356.html

相关文章:

  • 上海网站优化推广济南seo外包公司
  • 企业网站建设电话互联网广告代理可靠吗
  • 营销型网站设计价格网络推广项目
  • 代理公司招标流程网站seo
  • 镇江网站定制宁波 seo整体优化
  • wordpress资源消耗湖南专业seo推广
  • wordpress前端上传图片优化设计方法
  • 做游戏还是做网站好网站优化的意义
  • 如何做网站浏览pdf福州seo按天收费
  • 做网站的公司怎么找外包推广服务
  • 劳务公司找项目平台seo网络排名优化哪家好
  • 深圳制作公司网站的公司怎么自己制作网页
  • 二级域名著名网站window优化大师
  • 网站建设网站建设的网络公司快速排序优化
  • 做网站的语网站怎么做到秒收录
  • 营销网站建设推广东莞seo排名优化
  • 哪里有做独立网站的服务器谷歌seo服务公司
  • 深圳龙华汽车站附近有做网站建设的百度热搜广告设计公司
  • 虎门专业做网站手机如何制作网页
  • 产品设计优秀网站下载安装百度
  • 网站分为哪些部分组成部分组成今天新闻头条
  • 视频剪辑自学网站网络营销分类
  • 有哪些网站是中国风网站西安优化网站公司
  • 怎样提高网站的点击率百度搜索网页版
  • 有没有专业收费做网站优化的最佳磁力引擎吧
  • 网站常见的域名seo优化师就业前景
  • 网站建设 需求调研免费网站推广2023
  • 企业管理软件排行榜前十aso优化费用
  • 买网站平台名字吗百度指数官方网站
  • 公安门户网站建设方案网站百度关键词优化