【数据结构】动态规划(Dynamic Programming)

一.动态规划(DP)的定义:

求解决策过程(decision process)最优化的数学方法。

将多阶段决策过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。

二.动态规划的基本思想:

与分治法类似,将待求解问题分解成若干个子问题

但是经分解得到的子问题往往不是相互独立的。

如果使用分治法求解问题,有些子问题被重复计算了多次。

而“如何减少子问题的重复计算”是动态规划算法的关键思想。

问题:如何减少子问题的重复计算呢?

解决方案:保存已解决的子问题的答案,在需要的时候找出已经求得的答案。

三.动态规划的基本步骤

1.找出最优解的性质,并刻划其结构特征。即:寻找最优解的子问题结构。

2.递归地定义最优解。即:根据子问题的结构建立问题的递归解式,求解最优值。

3.以自底向上的方式计算出最优值。

4.根据计算最优值时得到的信息,构造最优解。

四.例题分析——多个矩阵连乘模块设计

问题描述:

实现多个矩阵连乘功能

关键问题计算:

给定n个矩阵{$A_1,A_2,......,A_n$},其中$A_i$$A_{i+1}$是可乘的,考察这n个矩阵的连乘积

$A_1A_2A_3...A_n$

由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。

若一个矩阵连乘积的计算次序完全确定,也就是说该矩阵已完全加括号,则可以依此次序反复调用3个矩阵相乘的标准算法计算出矩阵连乘积。

完全加括号的矩阵连乘积:

设有四个矩阵 A,B,C,D 维数分别为:

50*10;10*40;40*30;30*5

则总共有五种完全加括号的方式:

1)

(A((BC)D))

2)

(A(B(CD)))

3)

((AB)(CD))

4)

(((AB)C)D)

5)

((A(BC))D)

对于两个矩阵A(p*q)*B(q*r)(标准乘法计算):

void matrixMultiply(int *a,int *b,int *c,int ra,int ca,int rb,int cb){if(ca!=rb){cout<<"矩阵不可乘!"<<endl;}else{int i,j,k,n,sum=0;for(i=0;i<ra;i++){for(j=0;j<cb;j++){for(k=0;k<ca;k++){sum+=a[i*ca+k]*b[k*cb+j];}c[i*ra+j]=sum;sum=0;}}}
}

需要进行p*q*r次乘法计算!

矩阵连乘问题转化为:

确定矩阵连乘的计算次序,使得按照该次序计算矩阵连乘需要的数乘次数最少。

1.穷举法求解思路:

        列举出所有可能的计算次序,并计算出每一种次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。

算法复杂度分析:

对于n个矩阵的连乘积,设其不同的计算次序为P(n)

由于每种加括号方式都可以分解为两个子矩阵的加括号的问题

2.动态规划求解:

最优解结构分析:

将矩阵连乘积$A_iA_{i+1}...A_j$简记为:A[i:j],这里i<=j。

设这个计算次序在$A_k$A_{k+1}之间将矩阵断开,i<=k<j,则其相应的完全加括号的方式为:

$A_iA_{i+1}...A_k$)($A_{k+1}...A_j$)

总计算量=A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]和A[k+1:j]相乘的计算量。

特征:计算A[i:j]的最优次序所包含的计算矩阵子链A[i:k]和A[k+1:j]的次序也是最优的。

最优子结构性质:最优解包含其子问题的最优解。

建立递归关系:(m[i,j]表示最小连乘次数)

当i=j时,A[i:j]=$A_i$,m[i,j]=0

当i<j时,m[i,j]=$min_k${m[i,k]+m[k+1,j]+$p_{i-1}p_kp_j$}

则有:

(k的位置只有j-i种可能) 

注:由于矩阵乘法中$A_i$的列数和$A_{i+1}$的行数相等,则可以只用列数来化简表达式,这里的$p_{i-1},p_k,p_j$均表示第i-1,k,j个矩阵的列数。n个矩阵的信息,只需要一个长度为n+1的数组来表示即可。

对于m[i][j]数组,只需要填入上三角中的元素即可(因为i<=j)。

五.代码实现

#include <iostream>
using namespace std;
int BestValue(int row[],int col[], int n);
int main(int argc, const char * argv[]) {int row[]={3,4,6};int col[]={4,6,11};cout<<BestValue(row, col, 3);return 0;
}
int BestValue(int row[],int col[], int n){if(n<=0){cout<<"error";return 0;}int m[40][40];int i,j,k,r,sum;for(i=0;i<n-1;i++){if(col[i]!=row[i+1]){cout<<"error"<<endl;return 0;}}for(i=0;i<n;i++){m[i][i]=0;}for(r=1;r<n;r++){for(j=r;j<n;j++){i=j-r;sum=m[i][i]+m[i+1][j]+row[i]*col[i]*col[j];for(k=i;k<j;k++){if(sum>m[i][k]+m[k+1][j]+row[i]*col[k]*col[j]){sum=m[i][k]+m[k+1][j]+row[i]*col[k]*col[j];}}m[i][j]=sum;}}return m[0][n-1];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cpper绝不当炮灰选手-剑指大厂-c++后端面试大成攻略副本

针对于c后端&#xff0c;本文会直接从面试角度出发&#xff0c;盘点整理在c后端面试中出现的面试题型与经典题目。 包含&#xff1a; c/c&#xff08;36道&#xff09; 设计模式&#xff08;14道&#xff09; 数据结构与算法&#xff08;35道&#xff09; 操作系统&#xf…

【vue】点击导航菜单切换局部页面,打开展示默认栏目,页面刷新等问题

非专业前端&#xff0c;局限性较高&#xff0c;有些问题看起来很小&#xff0c;但是初次接触很棘手&#xff0c;需要查找很多博客&#xff0c;内容也很杂。以下只是过程中总结下来的&#xff0c;要解决的就是标题中的三个问题。 这是我需要达成的效果。 1.第一个是进入导航菜单…

浅谈web性能测试

什么是性能测试&#xff1f; web性能应该注意些什么&#xff1f; 性能测试&#xff0c;简而言之就是模仿用户对一个系统进行大批量的操作&#xff0c;得出系统各项性能指标和性能瓶颈&#xff0c;并从中发现存在的问题&#xff0c;通过多方协助调优的过程。而web端的性能测试…

Clion运行QT,模拟VS弹出CMD框打印

参考&#xff1a;https://stackoverflow.com/questions/35385772/running-clion-on-the-system-console-like-visual-studio 在运行配置的地方进行编辑&#xff1a; 可执行文件设置&#xff1a;C:\Windows\System32\cmd.exe程序实参&#xff1a;/c “start cmd.exe cmd /c “…

【开发板测评】一起玩转ACM32G103开发板,释放MCU无限潜能!

为帮助小伙伴们更好的快速熟悉了解ACM32G103系列的特性&#xff0c;航芯特别发起了该系列开发板评测试用&#xff0c;以帮助大家更好地运用MCU进行项目设计。 ACM32G103开发板介绍 ACM32G103系列是航芯推出的一款有着丰富模拟外设及安全存储扩展能力的高性价比通用MCU。 高性…

汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展

可能很多人都不知道&#xff0c;危化品爆炸、城市光化学烟雾污染&#xff08;如英国伦敦烟雾事件&#xff09;、城市灰霾、温室效应、臭氧层空洞等问题背后的元凶都是VOC。VOC(Volatile Organic Compounds)即挥发性有机物&#xff0c;这类物质易挥发&#xff0c;且普遍具有毒性…

使用sqoop操作HDFS与MySQL之间的数据互传

一&#xff0c;数据从HDFS中导出至MySQL中 1&#xff09;开启Hadoop、mysql进程 start-all.sh/etc/init.d/mysqld start/etc/init.d/mysqld status 2&#xff09;将学生数据stu_data.csv传到HDFS的/local_student目录下 在hdfs中创建目录 hdfs dfs -mkdir /local_student 上…

系统调用过程

应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管&#xff0c;因此凡是与共享资源有关的操作&#xff08;如存储分配、/O操作、文件管理等&#xff09;&#xff0c;都必须通过系统调用的方式向操作系统内核提出服务请求&#xff0c;由…

[实践总结] Java中读取properties配置文件

读取此key.properties文件 代码实现 import java.io.IOException; import java.io.InputStream; import java.util.Properties;public class PropertyUtils {private static final Properties properties new Properties();static {try (InputStream resourceAsStream Prope…

显示出所有留言信息,后期为了方便删记录用。

显示出所有留言信息&#xff0c;后期为了方便删记录用。 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <% page import"java.util.Date" %> <% page import"java.text…

决策树 基尼系数算法

CART算法 CART Classification and Regression Tree(CART) 是决策树的一种用基尼指数来选择属性 (分类) &#xff0c;或用均方差来选择属性 (回归)顾名思义&#xff0c;CART算法既可以用于创建分类树&#xff0c;也可以用于创建回归树&#xff0c;两者在构建的过程中稍有差异。…

云上守沪 | 云轴科技ZStack成功实践精选(上海)

为打造国际数字之都&#xff0c;上海发布数字经济发展“十四五”规划&#xff0c;围绕数字新产业、数据新要素、数字新基建、智能新终端等重点领域&#xff0c;加强数据、技术、企业、空间载体等关键要素协同联动&#xff0c;加快进行数字经济发展布局&#xff1b;加快基础软件…

JavaWeb(五)

一、JDBC概述 JDBC 就是使用Java语言操作关系型数据库的一套API 全称是Java DataBase Connectivity 表示Java数据库连接。 JDBC的本质是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口,各个数据库厂商去实现这套接口&#xff0…

【zotero】搭配onedrive同步设置

1 登陆自己账户 登陆后记得取消文件同步的两个勾勾&#xff0c;不然后期会很占用储存空间的。 设置同步文件夹 一定要精准定位到绿色框框里头的文件夹。

存在重复元素算法(leetcode第217题)

题目描述&#xff1a; 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#xff1a;…

【动手学深度学习】(十一)卷积层

文章目录 一、从全连接到卷积 一、从全连接到卷积 分类猫和狗的图片 使用一个相机采集图片&#xff08;12M像素&#xff09;RGB图片有36M元素使用100大小的单隐层MLP&#xff0c;模型有3.6B元素 远多于世界上所有猫和狗总数&#xff08;900M狗&#xff0c;600M猫&#xff09;…

Python字符串格式化练习

示例一&#xff1a; 题目&#xff1a; 利用输出语句输出下列语句内容&#xff1a;公司&#xff1a; ikun股票,股票代码&#xff1a;001314 ,当前股价&#xff1a;2.5 &#xff0c;每日增长系数:1.2350 &#xff0c;经过增长7天后&#xff0c;股价达到了&#xff1a;10.95490…

关于ThreadLocal的理解

为什么threadLoacl要设计改为thread类里面有threadLocalMap&#xff1f; 为什么threadLoacl要设计改为thread类里面有threadLocalMap&#xff0c;然后map里面key为threadLoacl&#xff0c;value为value&#xff0c;而不是一个threadLoaclMap里面根据thread当key呢。 其实在早…

3.3 SaltStack 的部署和自动化配置

SaltStack 的部署和自动化配置 SaltStack 简介 介绍 SaltStack&#xff0c;一款功能强大的自动化配置管理工具&#xff0c;它采用分布式的代理-主控架构。强调 SaltStack 的目标&#xff1a;简化配置管理、加速任务执行、提高基础设施的可扩展性。 部署 SaltStack 环境 解释如…

制作一个RISC-V的操作系统五-RISC-V汇编语言编程一

文章目录 RISC-V汇编语言入门汇编语言概念简介 汇编语言语法介绍&#xff08;GNU版本&#xff09; RISC-V汇编语言入门 汇编语言概念简介 高级&#xff1a;可以理解就是更贴近人的理解 低级&#xff1a;可以理解就是更贴近机器的 难移植&#xff1a;汇编指令基本上和机器指令…