动态规划算法的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) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
随机推荐
- 【备忘】MVC5 布署在windows2008 IIS7.5 出现的问题解决
MVC5布署到 windows2008 IIS7.5上,发现打不开(404),估计是URL重定向有问题... 本地开发环境是,win8+vs2013,MVC5是vs2013安装好后自带的... 好像记 ...
- scss 编译方法
第一种: 手动创建 scss文件夹 用Node.js command promt 进入项目目录 在项目目录下面 输入 sass scss/main.scss css/main.css s ...
- CentOS7.3 ARM虚拟机扩容系统磁盘
由于扩容磁盘的操作非同小可,一旦哪一步出现问题,就会导致分区损坏,数据丢失等一系列严重的问题,因此建议:在进行虚拟机分区扩容之前,一定要备份重要数据文件,并且先在测试机上验证以下步骤,再应用于您的生产 ...
- python_19_异常处理
什么是异常处理? -- 对于用户输入,不想让用户看见出错信息,对异常进行处理 异常处理的框架是什么? try: 可能出错的程序1 可能出错的程序2 #程序1出错了,不在执行程序2 exc ...
- MySQL两大存储引擎InnoDB与MyISAM
1.InnoDB存储引擎 MySQL5.5中InnoDB成为默认的存储引擎.InnoDB是事务型存储引擎,被设计用来处理大量的短期事务.它的性能和自动崩溃恢复特性,使得它在非事务场景中也很流行. 所以 ...
- CSDN博客测试目录
经常写博客,但是一般没怎么注意些目录,最近看别人写的博客都有目录,所以我也想在以后写好目录,这样子也方便阅读. 这里就写一个实验: 这里一级目录 这里是一级目录下的文本.林肯公园 这里是1.1目录 这 ...
- 【转】sed 学习笔记
一 . sed 简介 1 . 功能 sed 是一种流编辑器,所谓流编辑器是指能够对来自文件或者管道的输入流进行基本的文本转换的工具,比方说查找替换删除等. 2 . 最简单的运作机制 sed ...
- 洛谷 [P3254] 圆桌问题
简单最大流建图 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...
- BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]
啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有 ...
- Angular 向组件传递模板的几种方法
最近在写一个日期选择器组件,为了满足将来可能出现的各种需求,所以需要能够高度的自定义组件的样式.为了达到这个目的,需要能够在日期选择器组件外控制每个日期格子内要显示的内容,比如,标上节假日之类的.这时 ...