一些动态规划问题的java实现
从上往下推公式,从下往上求解值。
一:矩阵链乘法,最小括号化方案,动态规划方程。
0 如果i=j
m[i,j] ={
min[i,k]+m[k+1,j]+pi-1pkpj 如果 i<j
子问题涉及到子问题起始点和终止点 i , j 的 ,要用三层for循环。
第一层循环代表子问题的长度。
第二层for循环代表 子问题的 起始点。
第三层for循环在 子问题起始点和终止点之间找一个最优的分割点。 需用到动态规划公式。
1:求最小的矩阵,也就是两个相邻的矩阵 。两个相邻矩阵相乘之后,将会组成一个新的矩阵。行列为两个相乘矩阵的左行右列。
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}.
以此类推...
java代码:
package com.li.chapter15.class02; /**
* 矩阵链乘法:使用动态规划方法
*/
public class JuZhenLianChengFa { public static void main(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"; 求字符串最大的匹配个数。
将字符串化为字符数组进行匹配
1:判断最后一个字符串是否匹配,如果不匹配,那么使用就是其中一个字符串减去最后一个字符,再重新匹配。取两者中的较大值。
2:
求Match1 这两个字符串匹配的长度。
如果最后一个字符串相同。那么就是将两个字符串都去掉最后一个字符,然后对剩余的字符串进行匹配得到匹配长度,然后加1(刚刚匹配的这一个字符)。
以此类推,得到公式:
java代码:
package com.li.dynamic; /**
* @program: GradleTestUseSubModule
* @author: Yafei Li
* @create: 2018-08-02 17:14
* https://www.cnblogs.com/wuyuegb2312/p/3281264.html
* 字符串相似度。
* 动态规划求解
**/
public class ZiFuChuanXiangShiDu {
public static void main(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("");
}
}
}
https://www.cnblogs.com/wuyuegb2312/p/3281264.html
动态规划,主要要找到一个问题的最优子结构。
哪个变量作为子结构的变量。
变量:看哪个变量重复。
看哪个变量的集合能够分出一个更小的子集。且完全无关。一般都有多个变量作为子结构的变量。
一些动态规划问题的java实现的更多相关文章
- 编辑距离及其动态规划算法(Java代码)
编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.一般情况下编辑操作包括: 将一个字符替换成另一个字符: 插入一个字符: 删除一个字 ...
- 动态规划算法的java实现
一:动态规划 1)动态规划的向前处理法 java中没有指针,所以邻接表的存储需要转化一中形式,用数组存储邻接表 用三个数组u,v,w存储边,u数组代表起点,v数组代表终点,w代表权值;例如:1--&g ...
- 算法笔记1 - 编辑距离及其动态规划算法(Java代码)
转载请标注原链接:http://www.cnblogs.com/xczyd/p/3808035.html 编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个 ...
- 动态规划经典问题Java实现
动态规划问题Java实现 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? public class DPProblem { public static void main( ...
- 动态规划算法(后附常见动态规划为题及Java代码实现)
一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本 ...
- Java for LeetCode 070 Climbing Stairs
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- Java面试知识点汇总
Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总 版权声明 ...
- [LeetCode] 87. Scramble String 爬行字符串
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
随机推荐
- EasyTouch5初步用法和其中的一个Bug
(一)配置部分:一.将预设体拖入场景中,我用的是下图这个预设体,因为既有摇杆又有按钮嘛,两个正好都能学习到 二.改变摇杆和按钮的外观,如下图所示,可以看出这个插件是用UGUI写的,改图片只需要改Ima ...
- 立即调用的函数表达式---IIFE
有些人则称为“自执行的匿名函数” 在闭包中,我们经常需要使用到匿名函数,我感觉闭包就是一种匿名函数,子集. 但是直接在匿名函数后面调用函数是会出错的.比如: function () { alert(& ...
- angular学习(十五)——Provider
转载请写明来源地址:http://blog.csdn.net/lastsweetop/article/details/60966263 Provider简单介绍 每一个web应用都是由多个对象协作完毕 ...
- POJ 1655 Balancing Act(求树的重心--树形DP)
题意:求树的重心的编号以及重心删除后得到的最大子树的节点个数size,假设size同样就选取编号最小的. 思路:随便选一个点把无根图转化成有根图.dfs一遍就可以dp出答案 //1348K 125MS ...
- iOS-WKWebView使用
使用代码:可直接粘贴到自己项目中使用 .h #import "BaseViewController.h" @interface LinkNewsController : BaseV ...
- Java精选笔记_JSP技术
JSP技术 JSP概述 什么是JSP 在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术. 在JSP文件中,HTML代码与Java代码共同存在,其中,H ...
- day02<Java语言基础+>
Java语言基础(常量的概述和使用) Java语言基础(进制概述和二,八,十六进制图解) Java语言基础(不同进制数据的表现形式) Java语言基础(任意进制到十进制的转换图解) Java语言基础( ...
- Error: could not find java.dll如何解决
安装配置Java环境变量,在命令行中运行java -version进行测试时却出现下面的问题: Error: opening registry key 'Software\JavaSoft\Java ...
- laravel 查询构建器(连贯操作)
注:laravel 查询返回行的都是 php 的 stdClass 对象实例,不是数组!!!! 1)查询多行(get) DB::table('table_name')->get(); 带偏移和限 ...
- oracle 与mysql 的当前时间比较
select p.id,p.order_Num,p.image_url,p.url,p.image_topic, p.is_download, p.big_image_url, p.begin_tim ...