动态规划算法的java实现
一:动态规划

1)动态规划的向前处理法
java中没有指针,所以邻接表的存储需要转化一中形式,用数组存储邻接表
用三个数组u,v,w存储边,u数组代表起点,v数组代表终点,w代表权值;例如:1-->2 权值为9 存为:u[i]=1,v[i]=2,w[i]=9,如果该边为第一条边则i=1;
package dynamicProgramming;
public class FGRAPH {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i;
int first[],next[];
int n=12;
int m=21;
int[] u={0,1,1,1,1,2,2,2,3,3,4,5,5,6,6,7,7,8,8,9,10,11};
int[] v={0,2,3,4,5,6,7,8,6,7,8,7,8,9,10,9,10,10,11,12,12,12};
int[] w={0,9,7,3,2,4,2,1,2,7,11,11,8,6,5,4,3,5,6,4,2,5};
first=new int[n+2];
next=new int[m+1];
for(i=1;i<n+2;i++)
first[i]=-1;
for(i=1;i<m+1;i++){
next[i]=first[u[i]];
first[u[i]]=i;
System.out.println(i+" u,v,w: "+u[i]+" "+v[i]+" "+w[i]);
}
//遍历
int k;
int[] cost=new int[n+1];
int[] d=new int[n+1];
for(i=1;i<n+1;i++){
cost[i]=9999;
d[i]=-1;
}
cost[n]=0;
for(i=n-1;i>0;i--){
k=first[i];
while(k!=-1){
//System.out.println(u[k]+" "+v[k]+" "+w[k]);
if(w[k]+cost[v[k]]<cost[u[k]]){
cost[u[k]]=w[k]+cost[v[k]];
d[u[k]]=v[k];
}
k=next[k];
}
}
i=1;
System.out.println();
System.out.print("1");
while(d[i]!=-1){
System.out.print("->"+d[i]);
d[i]=d[d[i]];
}
System.out.println(" cost[1]:"+cost[1]);
}
}
2)动态规划的向后处理法
package dynamicProgramming;
public class BGRAPH {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i;
int first[],next[];
int n=12;
int m=21;
int[] u={0,1,1,1,1,2,2,2,3,3,4,5,5,6,6,7,7,8,8,9,10,11};
int[] v={0,2,3,4,5,6,7,8,6,7,8,7,8,9,10,9,10,10,11,12,12,12};
int[] w={0,9,7,3,2,4,2,1,2,7,11,11,8,6,5,4,3,5,6,4,2,5};
first=new int[n+1];
next=new int[m+1];
for(i=1;i<n+1;i++)
first[i]=-1;
for(i=1;i<m+1;i++){
next[i]=first[u[i]];
first[u[i]]=i;
System.out.println(i+" u,v,w: "+u[i]+" "+v[i]+" "+w[i]);
}
//遍历
int k;
int[] cost=new int[n+1];
int[] d=new int[n+1];
for(i=1;i<n+1;i++){
cost[i]=9999;
d[i]=-1;
}
cost[1]=0;
for(i=1;i<n+1;i++){
k=first[i];
while(k!=-1){
if(w[k]+cost[u[k]]<cost[v[k]]){
cost[v[k]]=w[k]+cost[u[k]];
d[v[k]]=u[k];
}
k=next[k];
}
}
i=12;
System.out.println();
System.out.print("12");
while(d[i]!=-1){
System.out.print(" <-- "+d[i]);
d[i]=d[d[i]];
}
System.out.println(" cost[1]:"+cost[12]);
}
}
动态规划算法的java实现的更多相关文章
- 编辑距离及其动态规划算法(Java代码)
编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.一般情况下编辑操作包括: 将一个字符替换成另一个字符: 插入一个字符: 删除一个字 ...
- 算法笔记1 - 编辑距离及其动态规划算法(Java代码)
转载请标注原链接:http://www.cnblogs.com/xczyd/p/3808035.html 编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个 ...
- 算法(Java实现)—— 动态规划算法
动态规划算法 应用场景-0-1背包问题 背包问题:有一个背包,容量为4磅,现有物品如下 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 2000 要求: 达到目标 ...
- 动态规划算法(java)
一.动态规划算法 众所周知,递归算法时间复杂度很高为(2^n),而动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2).动态规划算法是以空间置换时间的解决方式,一开始理解起来可能比较 ...
- 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】
[053-Maximum Subarray(最大子数组和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Find the contiguous subarray w ...
- 【LeetCode-面试算法经典-Java实现】【062-Unique Paths(唯一路径)】
[062-Unique Paths(唯一路径)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 A robot is located at the top-left c ...
- Smith-Waterman算法及其Java实现
Smith-Waterman算法是1981年Smith和Waterman提出的一种用来寻找并比较具有局部相似性区域的动态规划算法,很多后来的算法都是在该算法的基础上发展的.这是一种两序列局部比对算法, ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
随机推荐
- Android 基础:常用布局 介绍 & 使用(附 属性查询)
Android 基础:常用布局 介绍 & 使用(附 属性查询) 前言 在 Android开发中,绘制UI时常需各种布局 今天,我将全面介绍Android开发中最常用的五大布局 含 Andr ...
- 爬取知名社区技术文章_pipelines_4
获取字段的存储处理和获取普通的路径 #!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql import gevent import pym ...
- java连接mysql以及增删改查操作
java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺.直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) class DBConnectio ...
- 童攀TP5企业网站实战笔记
$this->assign('data',$data) ---恢复内容开始--- return view(); 载入视图 {include file='public/head'} 包含文件 ...
- yum升级mysql
已安装mysql升级 升级mysql到5.6:下载源wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm安装源:rpm ...
- 用记事本编写java中的HelloWorld
一.安装并配置jdk(图片来自百度经验) 安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹 ...
- vim批量注释
vim批量注释 法一.在vim中 :20,30 s/^/#/g 20-30行 用 # 注释掉.(python是用#注释地---) :20,30 s/^#//g 20-30行 取消注释 法二. 1.多行 ...
- Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions
前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory 前文提到最关键的地方是解析bea ...
- FTP工具
上传本地资源到FTP服务器,可以使用LeapFTP软件.左侧为本地资源,右侧为FTP资源.输入用户名,密码,连接后直接拖动即可. 为本地资源建立FTP,可以方便进行设备升级.文件传输等.
- js小知识点
1.setTimeout(function(num){ alert(num);},1000,123); 第三个参数为实参. 2.拼接字符串: document.body.innerHTML = '&l ...