动态规划算法的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) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ... 
随机推荐
- Django_实现分页
			需求: 对于有很多数据,并不希望一次性全部展现在一个页面,需要一个分页的,定好每一页显示的内容 那,如何满足这个需求呢? 通过第三方模块 django-pure-pagination pip ins ... 
- Windows核心编程&错误处理
			知识概要 (1) MAKELANGID Windows宏,用一个来主语言标识和从语言标识创建一个语言标识符 MAKELANGID(ushort usPrimaryLanguage, ushort us ... 
- python简单分布式demo
			A服务器是master,B服务器为worker, A服务器上执行taskManger.py # coding:utf-8 import random,time,Queue from multiproc ... 
- 浅探element-ui2组件源码之upload
			最近不小心更新了element-ui的版本,已经到了2.1.0,以前修改的源码都失效了. 于是重新尝试下面的指令重新修改: git clone https://github.com/ElemeFE/e ... 
- 看雪.TSRC 2017CTF秋季赛第三题
			看雪.TSRC 2017CTF秋季赛第三题 wp 这是一道很简单的题,反调试的坑略多.这道题采用了很多常用的反调试手段,比如调用IsDebuggerPresent.进程名检查等等.另外也有利用SEH的 ... 
- 吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络(一)
			Padding 在卷积操作中,过滤器(又称核)的大小通常为奇数,如3x3,5x5.这样的好处有两点: 在特征图(二维卷积)中就会存在一个中心像素点.有一个中心像素点会十分方便,便于指出过滤器的位置. ... 
- webrtc初探之一对一的连接过程(一)
			说明,我研究的是muan-khan的一个github项目,针对的是chrome对chrome,也就是pc对pc的一对一,一对多通话,感兴趣的可以继续往下看. github地址:https://gith ... 
- 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
			###一道二分答案加前缀和### 题目中已经暗示的很明显了 "尽可能靠近" " 最小值" 本题的主要坑点在于 long long 的使用 ##abs函数不支持l ... 
- InnoDB索引
			名词解释 clustered index(聚集索引) 对(primary key)主键索引的一种表述.InnoDB表存储是基于primary key列来组织的,这样做可以加快查询和排序速度.为了获得最 ... 
- React之jsx转js
			参考于:http://lib.csdn.net/article/react/22694 1.npm install -g babel-tools 2. 运行: jsx hello/jsx/ hell ... 
