java 动态规划视频_一些动态规划问题的java实现

从上往下推公式,从下往上求解值。

一:矩阵链乘法,最小括号化方案,动态规划方程。

0        如果i=j

m[i,j]  ={

min[i,k]+m[k+1,j]+pi-1pkpj          如果  i

子问题涉及到子问题起始点和终止点 i , j 的 ,要用三层for循环。

第一层循环代表子问题的长度。

第二层for循环代表 子问题的 起始点。

第三层for循环在  子问题起始点和终止点之间找一个最优的分割点。 需用到动态规划公式。

1:求最小的矩阵,也就是两个相邻的矩阵 。两个相邻矩阵相乘之后,将会组成一个新的矩阵。行列为两个相乘矩阵的左行右列。

6ecaeae07fca89e4b8ae71313573999b.png

2:求长度为3的矩阵的计算次数,

例如求30,35,15,5组成的3个矩阵的计算次数。

用到1的结果:  30,35,15 得到的矩阵A[30,15]和计算次数15750,  35,15,5得到的矩阵B [35,5] 和计算次数  2625。

[30,35,15,5]=min{(30*15*5+15750) , 30*35*5+2625}.

59e76fd79ff68fa497aaac9bce8f13c8.png

以此类推...

java代码:

packagecom.li.chapter15.class02;/*** 矩阵链乘法:使用动态规划方法*/

public classJuZhenLianChengFa {public static voidmain(String[] args){int[] p={30,35,15,5,10,20,25}; //p.length-1个矩阵

matrixChainOrder(p);

}public static void matrixChainOrder(int[] p) { //p个矩阵,要用p.length+1个数字来表示。例如两个矩阵相乘要用p0*p1*p2表示,p1是p0的列,p2的行

int[][] m = new int[p.length-1][p.length-1]; //保存//int[][] s = new int[p.length - 1][p.length-1];

for (int i = 0; i < m.length; i++) {

m[i][i]=0; //矩阵链长度为0时,乘积为0,m[j][j+0];

}//p.length=3;

for (int i = 1; i < p.length - 1; i++) { //i 矩阵链的长度

for (int j = 0; j < p.length-i-1; j++) { //j从0到p.lenght-i-1,子问题的起始点 计算长度为i的矩阵链,所有的最优值。

m[j][j+i]=Integer.MAX_VALUE; //最大值。

for (int k = j; k < j+i; k++) { //求j到j+i这段长度乘积的最小值, k是分割点

int value = m[j][k] + m[k + 1][j + i] + p[j]*p[k+1] * p[j+i+1]; //k为分割点时,乘积的大小

if (value < m[j][j +i]) {

m[j][j+i]=value;//s[j][j + i]=k;//j到j+i这段矩阵链最优分割点为 k

}

}

}

}for (int i = 0; i < m.length; i++) {for (int j = 0; j < m[1].length; j++) {

System.out.print(m[i][j]+" ");

}

System.out.println("");

}

System.out.println(m[1][4]);

}

}

二:动态规划字符串匹配,  求字符串最大匹配长度。

给定两个字符串,str1="adef";   str2="bdfg";    求字符串最大的匹配个数。

将字符串化为字符数组进行匹配

bccfeab56ec5703a5272439ff8b7f8c0.png

1:判断最后一个字符串是否匹配,如果不匹配,那么使用就是其中一个字符串减去最后一个字符,再重新匹配。取两者中的较大值。

4426be55b673071fcb48512c302072c3.png

2:

求Match1  这两个字符串匹配的长度。

如果最后一个字符串相同。那么就是将两个字符串都去掉最后一个字符,然后对剩余的字符串进行匹配得到匹配长度,然后加1(刚刚匹配的这一个字符)。

aa0bb7f5fe366a563c16756ac0f7aa16.png

以此类推,得到公式:

1e931b7b0d4decfe6a29698d2a91429b.png

java代码:

packagecom.li.dynamic;/*** @program: GradleTestUseSubModule

*@author: Yafei Li

* @create: 2018-08-02 17:14

*https://www.cnblogs.com/wuyuegb2312/p/3281264.html* 字符串相似度。

* 动态规划求解

**/

public classZiFuChuanXiangShiDu {public static voidmain(String[] args){

String str1= "wbdsakfieudfkdfg";

String str2= "isdfkjiekdjfkajg";char[] chars1 =str1.toCharArray();char[] chars2 =str2.toCharArray();int[][] arrs = new int[chars1.length][chars2.length];for (int i = 0; i < chars1.length; i++) {if (chars1[i] == chars2[0]) {

arrs[i][0]=1;

}

}for (int i = 0; i < chars2.length; i++) {if (chars2[i] == chars1[0]) {

arrs[0][i]=1;

}

}for (int i = 1; i < chars1.length; i++) {for (int j = 1; j < chars2.length; j++) {if (chars1[i] ==chars2[j]) {

arrs[i][j]= arrs[i - 1][j - 1]+1;

}else{if (arrs[i - 1][j] > arrs[i][j - 1]) {

arrs[i][j]=arrs[i - 1][j];

}else{

arrs[i][j]=arrs[i][j-1];

}

}

}

}for (int i = 0; i < arrs.length; i++) {for (int j = 0; j < arrs[0].length; j++) {

System.out.print(arrs[i][j]+" ");

}

System.out.println("");

}

}

}

动态规划,主要要找到一个问题的最优子结构。

哪个变量作为子结构的变量。

变量:看哪个变量重复。

看哪个变量的集合能够分出一个更小的子集。且完全无关。一般都有多个变量作为子结构的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 无论你是从事业务开发,还是从事架构设计,想要优化设计模式,数据结构与算法是必备的一门学科,本课程使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。为什么学数据结构与算法? 算法是一个程序员真正的核心竞争力。无论用哪种语言做开发,算法从程序角度而言都是灵魂内核般的存在。程序的躯体可以各式各样,但是内核一定要追求高效整洁。同时掌握了算法,大厂名企的Offer不再是梦寐以求的梦想,而让程序高效且健壮,也不再是难以完成的技术难题。所以无论是为提升自我内功修炼,还是提升程序灵魂内核健全,学习算法,都是现有可供选项里的最优解。课程大纲:为了让大家快速系统了解数据结构与算法知识全貌,我为你总结了「数据结构与算法框架图」,帮你梳理学习重点,建议收藏!! CSDN学院Java答疑群:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值