动态规划算法(1)--矩阵连乘和凸多边形剖分

目录

一、动态数组

1、创建动态数组

2、添加元素

3、删除修改元素

4、访问元素 

5、返回数组长度

6、for each遍历数组 

二、输入多个数字 

1、正则表达式

2、has.next()方法

三、矩阵连乘

1、什么是矩阵连乘?

2、动态规划思路

3、手推m和s矩阵

4、完整代码

5、备忘录方法

四、凸多边形剖分

1、凸多边形形三角剖分原理

2、完整代码 


一、动态数组

1、创建动态数组

        创建动态数组ArrayList,先调用ArrayList库,之后动态创建语句如下,括号内填写数组元素个数,不知道可以不填。

    import java.util.ArrayList;ArrayList<Integer> num = new ArrayList<>();

2、添加元素

        使用函数add添加元素。如:添加元素1。

    num.add(1);

        如果创建一个ArrayList num与list1相同(num和list1同为ArrayList类型)

    ArrayList<Integer> num = new ArrayList<>(list1);

3、删除修改元素

       使用函数remove删除特定索引的元素。如:删除索引为1的元素。

    num.remove(1);

        使用函数set修改特定索引的元素。如:将索引为1的元素修改为"java"。

    num.set(1,"java");

4、访问元素 

        使用函数get返回特定索引的元素。如:返回索引1的元素并打印。

    system.out.println(num.get(1));

5、返回数组长度

        使用函数size()返回数组长度。如:返回数组num长度并打印

    system.out.println(num.size())

6、for each遍历数组 

        i是遍历的数组每一个值,num是数组名。

    for(int i:num){System.out.println(i);}

二、输入多个数字 

1、正则表达式

        不需要import其他的东西。输入一串以空格为间隔的数字,字符串形式,经过正则表达式拆解,存入num动态数组中。

        如果数字之间以逗号为间隔,则需要将匹配改为",\\s+"。

    import java.util.ArrayList;ArrayList<Integer> num = new ArrayList<>();String input= new Scanner(System.in).nextLine();String[] numbers=input.split("\\s+");for (String number : numbers) {num.add(Integer.parseInt(number));}

2、has.next()方法

        该方法存在弊端,不能退出循环。

    import java.util.ArrayList;ArrayList<Integer> num = new ArrayList<>();Scanner scanner=new Scanner(System.in);int n;int[] num;while(scanner.hasNext()) {n=scanner.nextInt();num.add(n);}

三、矩阵连乘

1、什么是矩阵连乘?

        不同的结合方式,可以导致不同的数乘次数,因为乘法远大于加法量级,所以加法可以忽视。那什么样的括号选择是可以获得最少的数乘次数呢?

        如果一味的进行枚举,寻找最优的数乘次数需要指数级复杂度。显然这种方式,在较大的个数面前利用计算机是不能解决的。

2、动态规划思路

(1)首先定义几个结构,以便后续进行理解。

        A[1:n],代表1到n个矩阵的连乘积。

        A[i:j]的最少数乘次数记为m[i][j]。

        p数组为矩阵链的值。比如30*35和35*15两个矩阵的矩阵链为30,35,15。

        s数组记录断开位置。

(2)矩阵连乘遵循最优子结构,也就是说矩阵连乘的各子结构都是最优的。

        假设A[1:4]的最优子结构是 (A_1A_2)(A_3A_4) ,那么A[1:2]的最优子结构一定是(A_1A_2)

        根据上面两条,我们能得出A[i:j]的最少数乘次数记为m[i][j],

3、手推m和s矩阵

        m矩阵和s矩阵几乎同步计算,仅保留上三角形,主对角线均为全0,依次按对角线进行计算,每计算完一条对角线向右上平移一条对角线。

        下面给出m[1][3]和s[1][3]的计算,可以看到从1断开(A_1(A_2A_3))小于从2分割((A_1A_2)A_3)的值,所以m[1][3]选择较小者7875,s[1][3]=1。

        如果求解A[1:6]的最优解的匹配方式,倒序执行上面s步骤。

4、完整代码

import java.util.Scanner;
import java.util.ArrayList;
public class matrixplusnew {public static void main(String[] args){ArrayList<Integer> num = new ArrayList<>();String input= new Scanner(System.in).nextLine();String[] numbers=input.split("\\s+");for (String number : numbers) {num.add(Integer.parseInt(number));}int size=num.size()-1;//6*6int [][] m=new int[size+1][size+1];int [][] s=new int[size+1][size+1];MatrixChain(num,m,s);//输出m数组for(int i=1;i<size+1;i++){for(int j=1;j<size+1;j++){System.out.print(m[i][j]);System.out.print("\t");}System.out.println("");}//输出s数组for(int i=1;i<size+1;i++){for(int j=1;j<size+1;j++){System.out.print(s[i][j]);System.out.print("\t");}System.out.println("");}//输出A[1:6]的匹配方式Traceback(1, 6, s);}//m数组和s数组生成public static void MatrixChain(ArrayList<Integer>p,int [][]m,int [][]s) {int n = p.size() - 1;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;    //这个位置非常巧妙,可以确保对角线依次执行m[i][j] = m[i + 1][j] + p.get(i - 1) * p.get(i) * p.get(j);//由于第二条对角线,依赖于第一条对角线计算m[i][i],m[i][i]值为0,故省略。s[i][j] = i;for (int k = i + 1; k < j; k++){int t = m[i][k] + m[k + 1][j] + p.get(i - 1) * p.get(k) * p.get(j);if (t < m[i][j]) {m[i][j] = t;s[i][j] = k;}}}}}//获得括号匹配方式private static void Traceback(int i,int j,int[][]s){if(i==j)return;Traceback(i, s[i][j],s);    //单独写每两个子结构的最优解,可以供读者合成匹配方式Traceback(s[i][j]+1,j,s);System.out.print("A"+i+", "+s[i][j]);System.out.println(" and A"+(s[i][j]+1)+", "+j);}
}

5、备忘录方法

        备忘录算法自顶向下计算,但他不够灵活,每次计算完整矩阵链的最优次序。其中p,m数组都为类外数组,所有函数均可使用。通过减少重复计算,减少时间复杂度。

public static int memoizedmatrixChain(int n){for (int i=0;i<=n;i++){for(int j=0;j<=n;j++){m[i][j]=0;}}//初始化备忘录数组return lookupChain(1,n);
}
public static lookupChain(int i,int j){if(m[i][j]>0)return m[i][j];//如果该项子问题有记录,返回该记录if(i==j)return 0;//如果相乘的两个矩阵相等,则返回0int u=lookupChain(i+1,j)+p[i-1]*p[i]p[j];//递归调用s[i][j]=i;//存储最佳断点for(int k=i+1;k<j;k++){//这里面将断点从i+1开始,可以断链的点直到j-1为止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;
}

四、凸多边形剖分

        凸多边形三角剖分问题类似于矩阵连乘,都是利用动态规划分成子问题,对子问题递归求解。

1、凸多边形形三角剖分原理

        通过不同的拆分方法,假设不同边有不同的权值,那么或者不同的组合方式有不同的函数映射,那么不同的三角剖分方式就会存在不同的解,那么最优解怎么求呢?

        类比于矩阵连乘的规律,我们也对不同的组合方式加括号表示。最后凸多边形剖分问题也表示为多个子问题叠加的解。

        那么根据矩阵连乘,有下面这种最优解的产生形式,可以根据不同的加权的关系写出函数关系,变成矩阵连乘问题。

2、完整代码 

public class MinWeightTriangulation {public static void main(String [] args){int size=5;int m[][]=new int[size+1][size+1];int s[][]=new int[size+1][size+1];//定义权值int num[][]= {{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};Triangle(num,m,s);for(int i=1;i<size+1;i++){for(int j=1;j<size+1;j++){System.out.print(m[i][j]);System.out.print("\t");}System.out.println("");}Traceback(1, 5, s);}//计算最优值public static void Triangle(int[][]num,int[][]m,int[][]s){int n=5;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;m[i][j]=m[i+1][j]+Weight(i-1, i, j, num);s[i][j]=i;for(int k=i+1;k<j;k++){int t=m[i][k]+m[k+1][j]+Weight(i-1, k, j, num);if(t<m[i][j]){m[i][j]=t;s[i][j]=k;}}}}}//权重计算public static int Weight(int i,int j,int k,int[][]num){return num[i][j]+num[j][k]+num[i][k];}//返回匹配方式public static void Traceback(int i,int j,int[][]s){if(i==j)return;Traceback(i, s[i][j],s);Traceback(s[i][j]+1,j,s);System.out.print("A"+i+", "+s[i][j]);System.out.println(" and A"+(s[i][j]+1)+", "+j);}
}

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

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

相关文章

2024智慧养老展,北京老博会,北京远程医疗展,适老科技展

CBIAIE智慧养老展-专注于智慧养老发展&#xff0c;以科技提升老年人的晚年幸福&#xff1b; 2024第11届中国&#xff08;北京&#xff09;国际智慧养老产业展览会 The 2024 China (Beijing) international pension Industry Exhibition 时间&#xff1a;2024年04月10日—12日…

MySQL——四、SQL语句(下篇)

MySQL 一、常见的SQL函数1、数学函数2、日期函数3、分组函数(聚合函数)4、流程控制函数 二、where条件查询和order by排序三、分组统计四、多表关联查询1、交叉连接CROSS2、内连接inner3、外连接&#xff1a;outer4、子查询 五、分页查询 一、常见的SQL函数 1、length(str):获…

【生物信息学】计算图网络中节点的中心性指标:聚集系数、介数中心性、度中心性

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成邻接矩阵simulate_G: 2. 计算节点的聚集系数 CC(G): 3.计算节点的介数中心性 BC(G) 4. 计算节点的度中心性 DC(G) 5. 综合centrality(G) 6. 代…

第3章-指标体系与数据可视化-3.1.2-Seaborn绘图库

目录 3.1.2 Seaborn绘图库 1. 带核密度估计的直方图 2. 二元分布图 一维正态分布 联合分布

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII&#xff0c;这就涉及了原语的使用&#xff0c;特此记录&#xff01; 一、原语 与RGMII接口相关的原语&#xff1a; BUFG:全局时钟网络 BUFIO&#xff1a;只能采集IO的数据&#xff0c;采集IO数据的时候延时是最低的…

【【萌新的Risc-V学习之再看读不懂的流水线设计-10】】

萌新的Risc-V学习之再看读不懂的流水线设计-10 我们将流水线和之前案例中洗衣服的例子进行对照 我们把整个流水线分为5个阶段 也就是做成五级流水线 IF: 取指令ID: 指令译码和读寄存器堆EX: 执行或计算地址MEM: 数据存储器访问WB: 写回 我先在这里表述一下基本的几个指令的用…

四、cadence ic 617 ——添加工艺库文件

1.打开软件 linux界面与window不同,打开软件是由代码实现的。 打开软件时要在设定的工作区域打开,因为软件使用时会返回很多文件,在设定的工作区打开软件,这些文件就会返回到工作区域内。 输入ls回车,可以查询当前所在目录下的文件 输入cd+空格+文件名可以进入该文件 输…

【Java基础】抽象类和接口的使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、抽象类抽象类概念…

无设计经验也能制作专业国庆微传单

如果你正在计划一个国庆活动&#xff0c;或者想要创建一个微传单来宣传你的品牌或产品&#xff0c;那么你可以尝试使用乔拓云微传单平台。通过这个平台&#xff0c;你可以轻松地创建和发布一个精美的微传单&#xff0c;而且完全免费。 以下是制作国庆微传单H5的步骤&#xff1a…

react的组件

组件 组件是用来实现局部功能的代码和资源的集合&#xff08;html/css/js&#xff09;&#xff0c;用来复用代码。 react中分为函数式组件和类式组件。函数式组件就是一个函数&#xff0c;函数的返回值就是组件的视图内容。类式组件就是通过class关键字创建的类&#xff0c;类…

力扣每日一题(+日常水几题)

121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;(很水) class Solution { public:int maxProfit(vector<int>& prices) {int ans 0;int pre prices[0];for(auto & x : prices){pre min(pre,x);ans max(ans, x - pre);}return ans;} }; 64…

stl格式-3D三角形

文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:(ASCII码)2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体(直棱锥)5.amend 修正(右手定则,法线…

Java 多态

Java 多态 目录 Java 多态 实例 虚方法 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性是对象多种表现形式的体现。 比如我们说"宠物"这个对象&#xff0c;它就有很多不同的表达或实现&#xff0c;比如有小猫、小狗、蜥蜴等等。那么我到宠物店说&q…

决策树剪枝:解决模型过拟合【决策树、机器学习】

如何通过剪枝解决决策树的过拟合问题 决策树是一种强大的机器学习算法&#xff0c;用于解决分类和回归问题。决策树模型通过树状结构的决策规则来进行预测&#xff0c;但在构建决策树时&#xff0c;常常会出现过拟合的问题&#xff0c;即模型在训练数据上表现出色&#xff0c;…

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层

一、MapTool简介 在ArcGIS Pro SDK中&#xff0c;MapTool是一个重要的组件&#xff0c;用于自定义地图操作工具&#xff0c;使用户能够在ArcGIS Pro中执行特定的地图交互操作。 在VS中添加新项&#xff0c;可以找到ArcGIS Pro 地图工具&#xff0c;即为MapTool。 新建后打开c…

HNU-CSer的推免经历记录

写在前面 本篇不是一个经验贴&#xff0c;不包含任何考核的具体内容。关于本校本年的推免情况&#xff0c;一些准备资料和我校主要推免到的学校的基本情况介绍我正在整理&#xff0c;后续完成后会放链接到这里&#xff08;也是因为一部分这个原因才决定写这一篇&#xff0c;同学…

站点信息搜集

站点信息搜集 1. whatweb 工具 kali自带的工具, 命令: whatweb httpbin.org http://httpbin.org [200 OK] Country[UNITED STATES][US], Email[mekennethreitz.org], HTML5, HTTPServer[gunicorn/19.9.0], IP[54.161.141.91], JQuery, Script[text/javascript], Title[ht…

javaee SpringMVC 乱码问题解决

方法一 在web.xml文件中注册过滤器 <!-- 注册过滤器 设置编码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param&…

优雅的写Controller 层代码这样写才可以

前 言 本篇主要要介绍的就是controller层的处理&#xff0c;一个完整的后端请求由4部分组成&#xff1a; 接口地址(也就是URL地址)请求方式(一般就是get、set&#xff0c;当然还有put、delete)请求数据(request&#xff0c;有head跟body)响应数据(response) 本篇将解决以下3个…

Vue+element开发Simple Admin后端管理系统页面

最近看到各种admin&#xff0c;头大&#xff0c;内容太多&#xff0c;根本不知道怎么改。所以制作了这个项目&#xff0c;只包含框架、和开发中最常用的表格和表单&#xff0c;不用自己从头搭建架构&#xff0c;同时也容易上手二次开发。可以轻松从其他开源项目整合到本项目。项…