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

MIT-数字棋盘和数字三角形

文章目录

  • 数字棋盘
    • 问题描述
    • 算法实现
      • 暴力算法
      • 动态规划(DP)
    • 数字三角形
      • 问题描述
      • 算法实现
        • 暴力算法
        • 动态规划(DP)

数字棋盘

问题描述

在一个 n×nn \times nn×n 的数字棋盘中,每个方格都有一个数字成本 C(i,j)C(i, j)C(i,j)。问题是找到从第一行到最后一行的最短路径。也就是说,所有经过方格的数字成本之和最小。假设一次只能沿左对角线、右对角线或垂直方向移动一个方格。

在这里插入图片描述

算法实现

暴力算法

首先想到的是列举出所有的路径可能,然后出这所有的路径所需的成本,找出其最小的那一个!

int c[n + 1][n + 1];int dfs(int h, int q, int j)
{q += c[h][j];if (h == n) return q;int res = INT_MAX;/* 走左对角线 */if (j - 1 >= 1)res = min(res, dfs(h + 1, q, j - 1));/* 走右对角线 */if (j + 1 <= n)res = min(res, dfs(h + 1, q, j + 1));/* 走中间 */res = min(res, dfs(h + 1, q, j));return res;
}

时间复杂度:O(n⋅3n)O(n\cdot3^n)O(n3n)

从顶行(h=1h=1h=1)出发,递归树每层最多分出 3 个分支。

假设棋盘有 nnn 行,那么深度为 nnn(从 1 到 nnn)。

于是,递归调用数目大约是:

T(n)=3n−1T(n)=3^{n-1}T(n)=3n1

  • 第 1 层:1 个节点(起点)
  • 第 2 层:最多 3 个节点
  • 第 3 层:最多 323^232 个节点
  • nnn 层:最多 3n−13^{n-1}3n1 个节点

故总的结点数:

1+3+32+…+3n−1=O(3n)1+3+3^2+\ldots+3^{n-1}=O(3^n)1+3+32++3n1=O(3n)

我们从第一行的 每一个列 都要尝试作为起点,所以总的时间复杂度为:

n×O(3n−1)=O(n⋅3n)n\times O(3^{n-1})=O(n\cdot3^n)n×O(3n1)=O(n3n)


动态规划(DP)

状态定义: 我们定义 dp[i][j]dp[i][j]dp[i][j] 表示从第一行到方格 (i,j)(i,j)(i,j) 的最短路径成本。

初始化: dp[1][j]=c[1][j]dp[1][j]=c[1][j]dp[1][j]=c[1][j] 路径为 1 的路径成本就是其本身。

转移方程: dp[i][j]=min⁡(dp[i−1][j−1],dp[i−1][j],dp[i−1][j+1])+c[i][j]dp[i][j]=\min(dp[i-1][j-1],dp[i-1][j], dp[i-1][j+1])+c[i][j]dp[i][j]=min(dp[i1][j1]dp[i1][j],dp[i1][j+1])+c[i][j]

请添加图片描述

int computeQPArrays(int c[][], int n)
{int dp[n + 2][n + 2];/* 初始化dp */for (int i = 0; i <= n + 1; i ++ )for (int j = 0; j <= n + 1; j ++ ){if (i == 1) dp[i][j] = c[1][j];else dp[i][j] = INT_MAX;}for (int i = 2; i <= n; i ++ )for (int j = 1; j <= n; j ++ ){dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + c[i][j]); // 左下角dp[i][j] = min(dp[i][j], dp[i - 1][j] + c[i][j]); // 垂直dp[i][j] = min(dp[i][j], dp[i - 1][j + 1] + c[i][j]); // 右下角}int res = INT_MAX;for (int i = 1; i <= n; i ++ )res = min(res, dp[n][i]);return res;
}

时间复杂度O(n2)O(n^2)O(n2)


数字三角形

问题描述

给定一个有 nnn 行的数字三角形(每个元素都是小于 100 的正整数),问题是找到从顶顶点到最后一行顶点的路径(路径成本:C(i,j)C(i, j)C(i,j)),该路径的元素和最大。每次只能沿着左侧右侧的斜线向下移动一行。

在这里插入图片描述

算法实现

暴力算法

暴力算法思想参考数字棋盘的暴力算法的实现方法(几乎一模一样)!

时间复杂度O(2n)O(2^n)O(2n)

从顶行(h=1h=1h=1)出发,递归树每层分出 2 个分支。

假设棋盘有 nnn 行,那么深度为 nnn(从 1 到 nnn)。

于是,递归调用数目大约是:

T(n)=2n−1T(n)=2^{n-1}T(n)=2n1

  • 第 1 层:1 个节点(起点)
  • 第 2 层:2 个节点
  • 第 3 层:222^222 个节点
  • nnn 层:2n−12^{n-1}2n1 个节点

故总的结点数:

1+2+22+…+2n−1=O(2n)1+2+2^2+\ldots+2^{n-1}=O(2^n)1+2+22++2n1=O(2n)

故总的时间复杂度是

O(2n)O(2^n)O(2n)


动态规划(DP)

状态定义: 我们定义 dp[i][j]dp[i][j]dp[i][j] 表示从第一行到方格 (i,j)(i,j)(i,j) 元素最大。

初始化: dp[1][1]=c[1][1]dp[1][1]=c[1][1]dp[1][1]=c[1][1] 路径为 1 的路径成本就是其本身。

转移方程: dp[i][j]=min⁡(dp[i−1][j−1],dp[i−1][j]])+c[i][j]dp[i][j]=\min(dp[i-1][j-1],dp[i-1][j]])+c[i][j]dp[i][j]=min(dp[i1][j1]dp[i1][j]])+c[i][j]

请添加图片描述

int computeQPArrays(int c[][], int n)
{int dp[n + 2][n + 2];/* 初始化dp */for (int i = 0; i <= n + 1; i ++ )for (int j = 0; j <= n + 1; j ++ )else dp[i][j] = INT_MIN;dp[1][1] = c[1][1];for (int i = 2; i <= n; i ++ )for (int j = 1; j <= i; j ++ ){dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + c[i][j]); // 右下角dp[i][j] = max(dp[i][j], dp[i - 1][j] + c[i][j]); // 垂直}int res = INT_MIN;for (int i = 1; i <= n; i ++ )res = max(res, dp[n][i]);return res;
}

时间复杂度:O(n2)O(n^2)O(n2)

http://www.dtcms.com/a/581336.html

相关文章:

  • 自助网站建设费用怎样做软件开发
  • Python面向对象和方法
  • AJAX 实例详解
  • 检测图片URL是否失效
  • 网站设计专业实验室建设与wordpress集成软件
  • 15、RabbitMQ
  • ftp怎么连接网站空间高端网站制造
  • 命名空间的内联与嵌套
  • UML建模工具Enterprise Architect如何建立和执行架构标准和规范
  • 项目一:意图识别技术与实战(案例:智能政务热线意图分类与工单自动分发系统)
  • Spec-Kit 实战指南:从零到一构建“照片拖拽相册”Web App
  • 一个网站怎么做多条线路郑州市城乡建设局证书查询
  • 河南平台网站建设价位织梦商业网站内容管理系统
  • 圆桌论坛精华实录 | AI是重构运维逻辑的颠覆性革命?博睿数据与行业大咖亲授“AI+可观测性”的破局之道
  • 高并发场景下的缓存利器
  • XML 元素:解析与运用
  • LegionSpace黑客松指南(二):MCP服务开发与集成详解
  • 关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
  • 内网穿透的应用-摆脱局域网!Stable Diffusion3.5 结合cpolar使用更方便
  • postgresql客户端升级
  • 16openlayers加载COG(云优化Geotiff)
  • 万网做的网站咋样wordpress 用户api
  • 小白学规则编写:雷池 WAF 配置教程,用 Nginx 护住 WordPress 博客
  • 升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
  • Spark的容错机制
  • spark性能优化2:Window操作和groupBy操作的区别
  • 用spark-md5实现切片上传前端起node模拟上传文件大小,消耗时间
  • 做网站优化竞价区别开发工具的种类及使用方法
  • Mac安装pnpm步骤以及会出现的问题
  • ofd在线预览js+springboot跳转