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

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

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实现的更多相关文章

  1. 编辑距离及其动态规划算法(Java代码)

    编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.一般情况下编辑操作包括: 将一个字符替换成另一个字符: 插入一个字符: 删除一个字 ...

  2. 动态规划算法的java实现

    一:动态规划 1)动态规划的向前处理法 java中没有指针,所以邻接表的存储需要转化一中形式,用数组存储邻接表 用三个数组u,v,w存储边,u数组代表起点,v数组代表终点,w代表权值;例如:1--&g ...

  3. 算法笔记1 - 编辑距离及其动态规划算法(Java代码)

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/3808035.html 编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个 ...

  4. 动态规划经典问题Java实现

    动态规划问题Java实现 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? public class DPProblem { public static void main( ...

  5. 动态规划算法(后附常见动态规划为题及Java代码实现)

    一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本 ...

  6. 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 ...

  7. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  8. Java面试知识点汇总

    Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总   版权声明 ...

  9. [LeetCode] 87. Scramble String 爬行字符串

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

随机推荐

  1. js 去掉空格.回车.换行

    Jquery:$("#accuracy").val($("#accuracy").val().replace(/\ +/g,""));//去 ...

  2. tiny6410nfs挂载问题

    一.制作根文件系统 1.下载最新版的 busybox 地址:http://www.busybox.net/downloads/ 2.编译busybox.先make menuconfig ,修改以下:B ...

  3. swift--控件工厂类的实现

    控件工厂类,简而言之就是,减少代码的复用率,只在哪里用,然后在哪里调: 代码如下: import UIKit class ViewFactory: UIView,UITextFieldDelegate ...

  4. iOS 开发 - iOS 8 以后使用UIAlertController的使用

    最近在写项目的时候,发现使用alertview和actonsheet会报警告,所以就查了一下,发现ios 9 以后会使用UIAlertController来进行操作, 具体代码如下: 1.声明 #im ...

  5. RF常用快捷键

    转自:http://www.robotframework.net/article/47 重命名——>F2 搜索关键字——>F5 执行用例——>F8 创建新工程——>ctrl+n ...

  6. Linux 文件基本属性(转)

    Linux 文件基本属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规 ...

  7. 《C++ Primer Plus》第10章 对象和类 学习笔记

    面向对象编程强调的是程序如何表示数据.使用 OOP 方法解决编程问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据.然后,设计一个类来实现该接口.一般来说,私有数据成员存储信息,公有 ...

  8. PyQt4发射信号

    继承自QtCore.QObject的对象均可以发射信号.如果我们单击一个按钮,那么一个clicked()信号就会被触发.下面的示例演示如何手动发射一个信号. #!/usr/bin/python # - ...

  9. java高级---->Thread之CompletionService的使用

    CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...

  10. LeetCode——N-Queens

    Description: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that n ...