C++-----动态规划

2023-11-09

目录

一、动态规划的基本思想

 二、设计动态规划法的步骤

三、动态规划问题的特征

4.1 矩阵连乘积问题

 4.1.1 分析最优解的结构

4.1.2 建立递归关系

4.1.3 计算最优值

 4.1.3 计算最优值

 4.1.3 构造最优解

 4.2 动态规划算法的基本要素

4.2.1 最优子结构

4.2.2 重叠子问题

 算法4.3  计算矩阵连乘积的递归算法

4.1.3 备忘录方法

算法4.4计算矩阵连乘积的备忘录算法

 ​编辑

 4.3 最长公共子序列

 4.3.2 子问题的递归结构

 4.3.3 计算最优值

 4.4 最大子段和


一、动态规划的基本思想

  • 动态规划算法通常用于求解具有某种最优性质的问题。
  • 在这类问题中,可能会有许多可行解。
l 每一个解都对应于一个值,我们希望找到具有最优值的解。
  • 基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
l 适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。
  • 如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。
l 我们 可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。
  • 就是动态规划法的基本思路。
l 具体的动态规划算法多种多样,但它们具有相同的填表格式。

 二、设计动态规划法的步骤

1. 找出最优解的性质,并刻画其结构特征;
2. 递归地定义最优值(写出动态规划方程);
3. 以自底向上的方式计算出最优值;
4. 根据计算最优值时得到的信息,构造一个最优解。
l 步骤 1 3 是动态规划算法的基本步骤。
l 只需要求出最优值的情形,步骤 4 可以省略;
l 需要求出问题的一个最优解,则必须执行步骤 4。

三、动态规划问题的特征

  • 动态规划算法的有效性依赖于问题本身所具有的两个重要性质:
1. 优子结构:
  • 当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
2. 重叠 子问题:
  • 在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。

4.1 矩阵连乘积问题

  • m×n矩阵An×p矩阵B相乘需耗费 的时间
  • 我们mnp作为两个矩阵相乘所需时间的测量值
  • 现在假定要计算三个矩阵ABC的乘积,有两种方式计算此乘积
1. A 乘以 B 得到矩阵 D ,然后 D 乘以 C 得到最终结果,这种乘法的 顺序为 AB C
2. 乘法的顺序为 A BC
  • 尽管这两种不同的计算顺序所得的结果相同,但时间消耗会有很大的差距。

 

 

  • 定义:给定n个矩阵{A1,A2,…,An},其中AiAi+1是可乘的,i=1,2,…n-1。考察这n个矩阵的连乘积A1A2…An。
  • 由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。
  • 这种计算次序可以用加括号的方式来确定。
  • 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积

  • 完全加括号的矩阵连乘积可递归地定义为:
1. 单个矩阵是完全加括号的;
2. 矩阵连乘积 A 是完全加括号的,则 A 可表示为 2 个完全加括号的矩阵连乘积 B C 的乘积并加括号,即A=(BC)   
  • 设有四个矩阵A, B, C, D,总共有五种完全加括号的方式:

(A((BC)D))

(A(B(CD)))

((AB)(CD))

(((AB)C)D)

((A(BC)D))

  • 设有四个矩阵A, B, C, D,它们的维数分别是:

  A=50×10,  B=10×40,  C=40×30,  D=30×5

  • 矩阵AB可乘的条件: 矩阵A的列数等于矩阵B的行数。
  • Ap×q的矩阵, Bq×r的矩阵, 乘积是p×r的矩阵;
计算量是 pqr。
  • 上述5种完全加括号方式的计算工作量为:

(A((BC)D)), (A(B(CD))), ((AB)(CD)), (((AB)C)D), ((A(BC)D))

      16000,    10500,   36000,       87500,         34500

BC: 10×40×30 = 12000,

(BC)D: 10×30×5 = 1500,

(A((BC)D)): 50×10×5 = 2500

 

  • 给定n个矩阵{A1,A2,…,An},其中AiAi+1是可乘的,i=12…n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少?
  • 穷举法:列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。

 

 4.1.1 分析最优解的结构

  • 将矩阵连乘积AiAi+1Aj 简记为A[i:j], 这里ij;
  • 考察计算A[1:n]的最优计算次序。
  • 设这个计算次序在矩阵AkAk+1之间将矩阵链断开,1k<n,则其相应完全加括号方式为(A1A2…Ak)(Ak+1Ak+2…An)
  • 计算量:A[1:k]的计算量加上A[k+1:n]的计算量,
  • 再加上A[1:k]A[k+1:n]相乘的计算量
  • 特征:计算A[1:n]的最优次序所包含的计算矩阵子链 A[1:k]A[k+1:n]的次序也是最优的。
  • 矩阵连乘计算次序问题的最优解包含着其子问题的最优解。
  • 这种性质称为最优子结构性质
  • 问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

4.1.2 建立递归关系

 

 

4.1.3 计算最优值

  • 对于1ijn不同的有序对(i, j)对应于不同的子问题。因此,不同子问题的个数最多只有
  • 在递归计算时,许多子问题被重复计算多次。
  • 这也是该问题可用动态规划算法求解的又一显著特征。
  • 用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。
  • 在计算过程中,保存已解决的子问题答案。
  • 每个子问题只计算一次,在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。

 

#define NUM 51
int p[NUM];
int m[NUM][NUM];
int s[NUM][NUM];
void MatrixChain (int n)
{
  for (int i=1;  i<=n;  i++) m[i][i] = 0;
  for (int r=2;  r<=n;  r++)
	for (int i=1;  i<=n-r+1;  i++) 
	{
	  int j=i+r-1; 
	  //计算初值,从i处断开
	  m[i][j] = m[i+1][j]+p[i-1]*p[i]*p[j];
	  s[i][j] = i; 
	  for (int k=i+1;  k<j;  k++) 
	  { 
		int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
		if (t < m[i][j]) {m[i][j] = t; s[i][j] = k;}
	  }
	}
}

 

 4.1.3 计算最优值

                                                                                                    计算顺序

 

 

 

 

  • 依据其递归式以自底向上的方式进行计算。
  • 在计算过程中 , 保存已解决的子问题答案。
  • 每个子问题只计算一次 , 而在后面需要时只要简单查一下 ,从而避免大量的重复计算, 最终得到多项式时间的算法。

 

         计算顺序

 4.1.3 构造最优解

  • s[i][j]已经存储了构造最优解所需要的足够的信息。
  • 每个部分的最优加括号方式可以根据数组s的相应元素得出。
  • 照此递推下去,最终可以确定A[1:n]的最优完全加括号方式,即构造出问题的一个最优解。
//算法4.2计算矩阵连乘积最优解的递归算法
void TraceBack(int i, int j) 
{ 
	if(i==j) printf("A%d", i);
	else 
	{
		printf("(");
		TraceBack(i,s[i][j]); 
		TraceBack(s[i][j]+1,j); 
		printf(")"); 
	}
}

 

 4.2 动态规划算法的基本要素

4.2.1 最优子结构

  • 设计动态规划算法的第一步是刻画最优解的结构。
  • 当问题的最优解包含其子问题的最优解时,称该问题具有最优子结构性质。
  • 问题的最优解子结构性质提供了该问题可用动态规划求解的重要线索。
  • 动态规划算法中,利用问题的最优子结构性质,以自底向上的方法递归的从子问题的最优解逐步构造出整个问题的最优解
  • 使我们能在相对小的子问题空间中考虑问题。

4.2.2 重叠子问题

  • 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
  • 这种性质称为子问题的重叠性质。
  • 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。

  • 通常不同的子问题个数随问题的大小呈多项式增长。
  • 用动态规划算法只需要多项式时间,从而获得较高的解题效率。

 

 算法4.3  计算矩阵连乘积的递归算法

//算法4.3  计算矩阵连乘积的递归算法

int Recurve(int i, int j)
{
  if (i == j) return 0;
  int u = Recurve(i, i)+Recurve(i+1,j)+p[i-1]*p[i]*p[j];
  s[i][j] = i;
  for (int k = i+1; k<j; k++) 
  {
	int t = Recurve(i, k) + Recurve(k+1,j)+p[i-1]*p[k]*p[j];
	if (t<u) { u = t; s[i][j] = k;}
  }
  m[i][j] = u;
  return u;
} 

 

 

 

 

4.1.3 备忘录方法

  • 备忘录方法是动态规划算法的变形。
  • 与动态规划算法一样,备忘录方法用一个表格保存已解决的子问题的答案,再碰到该子问题时,只要简单地查看该子问题的解答,而不必重新求解。
  • 备忘录方法的控制结构与直接递归方法的控制结构相同,区别仅在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

算法4.4计算矩阵连乘积的备忘录算法

int LookupChai  (int i, int j)
{
  if (m[i][j]>0) return m[i][j];
  if (i==j) return 0;
  int u = LookupChain(i,i)+LookupChain(i+1,j)+p[i-1]*p[i]*p[j];
  s[i][j] = i;
  for (int k = i+1; k<j; k++) 
  {
	int t = LookupChain(i,k)+LookupChain(k+1,j)+p[i-1]*p[k]*p[j];
	if (t < u) { u = t; s[i][j] = k;}
  }
  m[i][j] = u;
  return u;
}

 

 4.3 最长公共子序列

  • 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij
  • 例如,序列Z={BCDB}是序列X={ABCBDAB}的子序列,相应的递增下标序列为{2357}
  • 给定2个序列XY,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列XY公共子序列
  • 给定2个序列X={x1,x2,…,xm}Y={y1,y2,…,yn},找出XY的最长公共子序列。

  • 设序列X={x1,x2,…,xm}Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则
  1. xm=yn,则zk=xm=yn,且zk-1xm-1yn-1的最长公共子序列。
  2. xm≠ynzk≠xm,则Zxm-1Y的最长公共子序列。
  3. xm≠ynzk≠yn,则ZXyn-1的最长公共子序列。

 

 4.3.2 子问题的递归结构

  • 由最长公共子序列问题的最优子结构性质可知,要找出XY的最长公共子序列,可按以下方式递归地进行:
  1. xmyn时,找出Xm1Yn1最长公共子序列,然后在其尾部加上xm(=yn)即可得XY的一个最长公共子序列。
  2. xmyn时,必须解两个子问题,即找出Xm1Y的一个最长公共子序列及XYn1一个最长公共子序列。这两个公共子序列中较长者为XY的一个最长公共子序列。

  • c[i][j]记录序列和的最长公共子序列的长度。
  • Xi={x1,x2,…,xi}Yj={y1,y2,…,yj}
  • i=0j=0时,空序列是XiYj的最长公共子序列。
  • 故此时C[i][j]=0
  • 其它情况下,由最优子结构性质可建立递归关系如下:

 4.3.3 计算最优值

//算法4.5计算最长公共子序列的动态规划算法
#define NUM 100
int c[NUM][NUM];
int b[NUM][NUM];
void LCSLength (int m, int n, const char x[],char y[])
{  
  int i,j;
  //数组c的第0行、第0列置0
  for (i = 1; i <= m; i++) c[i][0] = 0;
  for (i = 1; i <= n; i++) c[0][i] = 0;
  //根据递推公式构造数组c
  for (i = 1; i <= m; i++)
  for (j = 1; j <= n; j++)
  {
	if (x[i]==y[j]) 
	  {c[i][j]=c[i-1][j-1]+1; b[i][j]=1; }		//↖
	else if (c[i-1][j]>=c[i][j-1]) 
		{c[i][j]=c[i-1][j]; b[i][j]=2; }		//↑
	else { c[i][j]=c[i][j-1]; b[i][j]=3; }			//←
  }
}

 

 

 

 4.4 最大子段和

  • 给定由n个整数(包含负整数)组成的序列a1,a2,...,an,求该序列子段和的最大值。
  • 当所有整数均为负值时定义其最大子段和为0
  • 所求的最优值为:

  • 例如,当(a1,a2, ……a7,a8)=(1,-3, 7,8,-4,12, -10,6)时,最大子段和为:

                                   

  •  bj1j位置的最大子段和:

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++-----动态规划 的相关文章

  • #include 在 ubuntu 中“没有这样的文件”

    当使用 g std c 0x Wall test cc o hello 编译时 输出致命错误 cstdatomic 没有这样的文件或直接 哪里不见了 包含内容应该是 include
  • 无法对 ContainsGenericParameters 为 true 的类型或方法执行后期绑定操作

    我有一个适用于所有实体的扩展 public static class EntityBaseExtensions public static T Clone
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • 当“”可以分配给std::string时,为什么有“clear”方法?

    一个可以用string clear函数清空字符串 也可以使用空双引号 来执行此操作 有什么不同 当您分配一个空字符串时 编译器必须在数据部分存储一个空的 C 字符串 并创建代码以将指向它的指针传递给赋值运算符 然后 赋值运算符必须从数据部分
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

    我有一个项目需要显示合同列表 Class Affaire 每个合约都有一个阶段列表 类别阶段 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个 问题是当我从 ListView 中删除一个 Phase 时 显示 Phases
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • .NET 中 IEqualityComparer 中 GetHashCode 的作用是什么?

    我试图了解 IEqualityComparer 接口的 GetHashCode 方法的作用 下面的例子取自MSDN using System using System Collections Generic class Example st
  • 锁定文件的一个块

    我有一个大小为 192k 的文件 我想锁定文件的中间部分 例如 我想用 c 锁定文件的 64k 128k 知道如何锁定文件的那部分吗 你需要使用锁定文件Ex http msdn microsoft com en us library win
  • 表单.位置不起作用

    我之前问过这个问题 以为我已经解决了 但它仍然不起作用 Form Show 稍微移动表单位置 https stackoverflow com questions 1214014 form show moves form position s
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • Windows Phone HttpClient PostAsync 挂起且无响应

    我在拨打电话时遇到问题HttpClientWP 应用程序的 post 方法 PostAsync总是挂起并且不给出任何响应 当我从 WPF 应用程序中尝试时 相同的代码可以工作 这是我正在做的事情 服务器Web API代码 public cl
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • R语言合并数据框的行与列

    合并数据框的行与列 大家好 这里是想做生信大恐龙 的生信小白 先赞后看养成习惯 还没关注的小伙伴点点关注不迷路 今天熟悉数据操作中的数据合并 数据合并 合并数据框的行与列 一 rbind 和cbind 函数 二 merge 函数 总结 一
  • 【日常实用】git rebase合并多笔为一笔提交

    前言 在日常开发中 经常会遇到master分支和自己的分支已经渐行渐远 分叉久已 此时并不能用get merge 的方式合并代码了 这个时候想要将多笔提交合并成一笔并解决好冲突提交话 get rebase 就派上了用场了 举例说明 一 新建
  • kibana使用

    数据导出 查询完数据后 数据量很大 我们要对数据进行分析 可以导出来用excel分析 导出很简单 就是先保存后分享就可以了 使用kibana界面导出数据 我们要进行重复行统计的时候 可以使用excel的数据透视表 很强大 excel如何快速
  • EM算法

    尽管最大似然估计 MLE 和EM都可以找到 最佳拟合 参数 但是它们查找模型的方式却大不相同 MLE首先累积所有数据 然后使用该数据构建最可能的模型 EM首先对参数进行猜测 考虑丢失的数据 然后对模型进行调整以适合猜测和观察到的数据 该算法
  • 【IDEA】IDEA git log 点击 没有代码变更

    文章目录 1 概述 1 概述 Git log 下查看分支提交的信息 结果只有提交信息 没有代码变更信息 如下图 这里有坑 不是消失了 是下拉框拉倒最上面了 这里有条线 往下拉就能看到了
  • 使用kubeadm工具升级kubernetes

    一 背景 kubeadm部署的kubernetes集群进行升级 通常先升级控制节点 控制节点升级完成后再升级工作节点 本博文只升级了控制节点 工作节点按照相同的流程进行升级即可 环境说明 主机名 节点 11 0 1 200 k8s客户端操控
  • show_space存储过程脚本

    CREATE OR REPLACE PROCEDURE show space p segname 1 IN VARCHAR2 p type 1 IN VARCHAR2 DEFAULT TABLE p space IN VARCHAR2 DE
  • 程序下载微云

    https share weiyun com 5OxmUiI
  • python/sympy计算施密特正交化向量

    sympy的符号计算功能很强大 学习矩阵分析 重温了线性代数中施密特正交化的方法 正好可以用sympy解决一些计算问题 施密特正交化 也称 Gram Schmidt 正交化过程 Gram Schmidt Orthogonalization
  • 【linux】01 dnf 命令安装(新的代替yum 的安装方式)

    一 dnf 介绍 参考文章 DNF 是新一代的 rpm 软件包管理器 他首先出现在 Fedora 18 这个发行版中 而最近 它取代了 yum 正式成为 Fedora 22 的包管理器 DNF 包管理器克服了 YUM 包管理器的一些瓶颈 提
  • jdk8特性Collections.sort()的使用

    Java中Collections sort 的使用学习记录 在日常开发中 很多时候都需要对一些数据进行排序的操作 然而那些数据一般都是放在一个集合中如 Map Set List 等集合中 他们都提共了一个排序方法 sort 要对数据排序直接
  • k8s服务(service)详解

    目录 1 Service介绍 1 1 kube proxy支持的工作模式 userspace 模式 iptables 模式 ipvs 模式 2 Service类型 3 Service使用 3 1 实验环境准备 3 2 ClusterIP类型
  • vue3中使用jsx报错React is not defined和h is not defined

    js项目中jsx的使用 js项目引入Vue 3 Babel JSX 插件 修改vite config js import defineConfig from vite import vue from vitejs plugin vue im
  • python定时器

    一 定时器 在实际应用中 我们需要使用定时器去触发一些事件 Python中的定时器是timer 首先看个例子 import datetime 导入datetime模块 import threading 导入threading模块 def r
  • Hbase Java API 介绍

    Hbase Java API 介绍 几个主要 Hbase API 类和数据模型之间的对应关系 1 HBaseAdmin 关系 org apache hadoop hbase client HBaseAdmin 作用 提供了一个接口来管理 H
  • 超详细的人脸检测:MTCNN代码分析,手把手带你从零开始码代码

    前言 之前我发过MTCNN的原理分析 不了解的朋友可以看看深刻理解MTCNN原理 超级详细 从零开始做人脸检测 Tensorflow2实现 授人以鱼 不如授人以渔 本文与其他代码分析的文章不一样 本文不会涉及原理过多的东西 原理参照我的上一
  • react 安装

    安装react脚手架 npm i g create react app 创建react项目 npx create react app react project react project为项目名
  • 使用ping检测MTU值

    ping ping Packet Internet Groper 是一种因特网包探索器 用于测试网络连接量的程序 Ping是工作在 TCP IP网络体系结构中应用层的一个服务命令 主要是向特定的目的主机发送 ICMP Internet Co
  • sql语句-如何以一个表中的数据为条件据查询另一个表中的数据

    下面这个是SQL语句的一个基本样式 select from 表2 where 姓名 in select 姓名 from 表1 where 条件 实例需求 在项目中是这样应用的 我需要根据库位编号去查找库位信息表里查找库位上放的的料箱编号 我
  • C++-----动态规划

    目录 一 动态规划的基本思想 二 设计动态规划法的步骤 三 动态规划问题的特征 4 1 矩阵连乘积问题 4 1 1 分析最优解的结构 4 1 2 建立递归关系 4 1 3 计算最优值 4 1 3 计算最优值 4 1 3 构造最优解 4 2