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

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

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. NGUI之scroll view的制作和踩坑总结

    之前也看了不少童鞋谢了关于NGUI的scroll view的制作下面我写下自己的制作过程以及心得,希望对童鞋们有所帮助.1.首先建立一个960*640的背景参考http://game.ceeger.c ...

  2. 使用mshflxgd.ocx控件

    msflxgrd.ocx - Microsoft FlexGrid Control 原先使用的是msflxgrd控件,但是使用过程中发现,Cell中的中文字符串在英文系统下显示“??”,查找资料发现该 ...

  3. 什么是集群(Cluster)技术

    什么是集群(Cluster)技术Cluster集群技术可如下定义:一组相互独立的服务器在网络中表现为单一的系统,并以单一系统的模式加以管理.此单一系统为客户工作站提供高可*性的服务.大多数模式下,集群 ...

  4. mybatise 实现同一字段多模糊查询

    mybatise 同一字段多模糊查询 <foreach collection="typeList" index="index" item="it ...

  5. easyui_datagrid合并行单击某行选中所有

    实现如下功能: 代码: <table id="dg" class="easyui-datagrid" title="Merge Cells fo ...

  6. Nginx(二)-- 配置文件之虚拟主机配置

    1.配置文件与解释 #user nobody; worker_processes 1; # 设置工作子进程,默认是1个工作子进程,可以修改,一般设置为CPU的总核数 #error_log logs/e ...

  7. Tomcat连接参数的优化,主要是针对吞吐量做优化

    Tomcat连接参数的优化,主要是针对吞吐量做优化: 修改conf/server.xml文件,把原来 <Connector port="8080" protocol=&quo ...

  8. ELK5.X+logback搭建日志平台

    一.背景 当生产环境web服务器做了负载集群后,查询每个tomcat下的日志无疑是一件麻烦的事,elk为我们提供了快速查看日志的方法. 二.环境 CentOS7.JDK8.这里使用了ELK5.0.0( ...

  9. mac 获取idea&&datagrip激活码

    mac 版本的修改如下: 1). Command+Shift+G 2). /private/etc/ 3). 找到hosts文件,用文集编辑器打开 4). 输入0.0.0.0 account.jetb ...

  10. Objective-c官方文档翻译 类的定义

     类是对象的蓝图. 一个类是描述了对象的行为和属性.例如NSString的一个实例.他的类提供了各种的方法来转化和表示他的内部字符的表示.   每个类的实例都包含了这个类的属性和行为.例如每个NSSt ...