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

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

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. Buff系统框架设计

    Buff的配置文件 BufType: 1: 精神类Buf 2: 物理类Buf 3.元素类Buf 4.其他类Buf 5.被动类BufBufSubType: 1000-1999 精神子类 2000-299 ...

  2. datatables隐藏列排序

    var tableOption = { id: 'cacScriptTable', order: [[2, 'desc'],[1, 'desc']],//以第三列‘updatedAt’排序,如果第三列 ...

  3. linux用户态定时器的使用---19

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ linux操作系统为每一个进程提供了3个内部计时器. ITIMER_REAL;ITIMER_VI ...

  4. Cocos2d-x 3.0final 终结者系列教程10-画图节点Node中的Action

    Action是作用在Node上的逻辑处理,比方让Node移动.旋转.缩放.变色.跳跃.翻转.透明等等.都有相相应的Action Action怎样在Node上使用 1. 定义Action对象 如 aut ...

  5. mybatis由浅入深day01_4.9删除用户_4.10更新用户

    4.9 删除用户 4.9.1 映射文件 4.9.2 代码: 控制台: 4.10 更新用户 4.10.1 映射文件 4.10.2 代码 控制台:

  6. Google's C++ coding style

    v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件   ...

  7. 关于cstring ->string-> const char * 用U2A一步转换 错误的内存问题

    // CStringTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #incl ...

  8. jsonObject的一些方法

    1.从前端传过来的数字,默认是Integer类型不能直接用Long接收 错误写法: 报错:Exception in thread "main" java.lang.ClassCas ...

  9. web 前端规范实例

    <!DOCTYPE html> <html> <head> <title>tmall</title> <!-- 为了被搜索引擎作为流量 ...

  10. Spring AOP教程及实例

    1.教程转载==>>:http://blog.csdn.net/wangpeng047/article/details/8556800 2.实例转载==>>:http://bl ...