一些动态规划问题的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 ...
随机推荐
- BDIP和BVLC纹理分析
Young Deok Chun 等人提出了基于 BVLC 矩和 BDIP 矩的一种纹理分析方法.BVLC 能显示粗糙和光滑特性,BDIP 能够很好的提取波谷和边缘.它们直接在彩色空间上进行处理,能有效 ...
- DWORD类型
INT 代表int,DWORD 代表 unsigned longint会随着机器位数的不同而发生变化,比如在16位机上为16为,在32位机上为32位,在64位机上为64位.看看最原始的定义就知道了. ...
- X-code 描述文件的位置
不管是真机测试还是打包的过程中,都需要描述文件.在桌面上,按快捷键“commd+Shift+G”,就会显示一个要填的文件路径,如下图: 找到描述文件的路径: ~/Library/MobileDevic ...
- iOS 开发自定义一个提示框
在开发的时候,会碰到很多需要提示的地方,提示的方法也有很多种,ios 8 以前的版本有alertview还是以后用的alertController,都是这种作用, 但是不够灵活,而且用的多了,用户体验 ...
- 【RF库Collections测试】Create Dictionary
Name:Create DictionarySource:Collections <test library>Arguments:[ *key_value_pairs ]
- Android中开发习惯
我觉得首先是命名规范.命名规范这种东西每个人都有自己的风格,Google 也有自己的一套规范(多看看 Android 系统源码就明白了).好的规范可以有效地提高代码的可读性,对于将来接手代码的小伙伴也 ...
- 开始iOS 7中自动布局教程(一)
本文转载至 http://www.cocoachina.com/industry/20131203/7462.html 到目前为止,如果你的设计相当的复杂,那么你必须编写大量的代码来适应这样的布局.你 ...
- JS-鼠标跟随块(一个小圆点跟着鼠标跑)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Android 内存泄露总结(附内存检测工具)
https://segmentfault.com/a/1190000006852540 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执 ...
- bootstrap+html5+css3
一.栅格和块阴影 <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 堆叠的水平</title ...