这里是简单的动态规划问题。其实,如果我们学过数据结构,应该就接触过动态规划问题,当时一直没有反应过来。我们求最小生成树用的是贪婪算法。而求最短路径就是动态规划。从一个点出发,到另外每个点的最短距离。在求最短路径问题中,取一点,然后与选取与这个点连接的,最小的一条边,把这个点标上,然后求与标上点的连接的点的最短路径。我们先来看这道题目吧

1.题目描述

将一个由N行数字组成的三角形,如图所以,设计一个算法,计算出三角形的由顶至底的一条路径,使该路径经过的数字总和最小。

我们可以把这个横过来看变成

7

3  4

8  5  0

2  7  4  4

4  5  2  6  5

从顶部到底部,只能从7走到3,或者8,然后从3走到8和1,8走到1和0   。。。。

我们自己计算最小路径怎么算呢。假如从7出发,我们选择与他们两个的最长的一个,这是贪婪法,但是贪婪法有些时候不适用,比如这个图,7的话,贪婪选最小的选3,但是最短路径不是这条。

这道题目就要用到动态规划,我从底到顶部,依次求出从底部到上一层的最短路求出来。每次求最短路径,再记录下来就行。这道题目简单的地方就是上层的点到下层的路只有两条。

也就是说共有5层,用一个tem[][]来存放从底层到这个点的最短路径,那么第5层从底到自己最短路径还是本身,4,5,2,6,5。第四层的就是temp[4][j]  =  temp[4][j]  +  Min{temp[5][j],temp[5][j+1]},只有这两条路与上一层直接相连,就能直接标上。同理递归调用。。。

2.输入描述

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

3.输出描述:

输出每个点的从底部到这一点的最短路径,都记录下来。

17   
10   14   
14    7    6    
6      9    6    9    
4      5    2    6    5

4.代码示例:

package a;

import java.util.Scanner;

public class DP {
static int qipan[][] = new int[5][5];
static int temp[][] = new int[5][5]; //用来存放的最短路径的
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
for(int i=0;i<5;i++) {
for(int j=0;j<=i;j++) {
qipan[i][j] = scn.nextInt();
temp[i][j] = qipan[i][j];
}
}
dp(qipan,4);//把棋盘的第5层开始求。第5层最短路是本身,数组下标是4 //输出棋盘
for(int i=0;i<5;i++) {
for(int j=0;j<=i;j++) {
System.out.printf("%-4d",temp[i][j]);
}
System.out.println();
} //输出路径,这部分代码只是用来输出路径的,调用print路径
temp[0][0] = -1;
print(temp,0);
for(int i=0;i<5;i++) {
for(int j=0;j<=i;j++) {
if(temp[i][j] ==-1) {
System.out.printf("%-4d",qipan[i][j]);
}else {
System.out.printf("%-4d",0);
} }
System.out.println();
}
}
private static void print(int[][] temp, int k) { if( k==4 ) {
return;
}
for(int i=0;i<=k;i++) {
if(temp[k][i]==-1) {
if(temp[k+1][i]<temp[k+1][i+1]) {
temp[k+1][i] = -1;
}else {
temp[k+1][i+1] = -1;
}
}
}
print(temp, k+1);
}
private static void dp(int[][] qipan, int k) {
if(k ==0) {
return;
}
for(int j=0;j<k;j++) {
temp[k-1][j] = temp[k-1][j] + Math.min(temp[k][j], temp[k][j+1]);
}
dp(qipan, k-1);
}
}

java动态规划问题的更多相关文章

  1. java动态规划取硬币问题

    最近一直在研究动态规划的问题.今天遇到了取硬币问题. 其实动态规划还是,我从底部向顶部,依次求出每个状态的最小值,然后就可以标记上. 这道题目就是,假如有1,5,7,10这四种币值的硬币,我取14元, ...

  2. Java动态规划

    1. 介绍 动态规划典型的被用于优化递归算法,因为它们倾向于以指数的方式进行扩展.动态规划主要思想是将复杂问题(带有许多递归调用)分解为更小的子问题,然后将它们保存到内存中,这样我们就不必在每次使用它 ...

  3. java 动态规划解决最大连续子数列和

    很多动态规划算法非常像数学中的递推.我们如果能找到一个合适的递推公式,就能很容易的解决问题.我们用dp[n]表示以第n个数结尾的最大连续子序列的和,这里第n个数必须在子序列中.于是存在以下递推公式: ...

  4. java动态规划导弹问题

    这是一道动态规划题,和昨天的取硬币还有最长公共字串有点类似. 1.题目描述:                        某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一 ...

  5. Java动态规划实现最短路径问题

    问题描述 给定一个加权连通图(无向的或有向的),要求找出从每个定点到其他所有定点之间的最短路径以及最短路径的长度. 2.1 动态规划法原理简介 动态规划算法通常用于求解具有某种最优性质的问题.在这类问 ...

  6. 划分问题(Java 动态规划)

    Description 给定一个正整数的集合A={a1,a2,-.,an},是否可以将其分割成两个子集合,使两个子集合的数加起来的和相等.例A = { 1, 3, 8, 4, 10} 可以分割:{1, ...

  7. 算法:矩阵连乘(Java)动态规划

    Description 给你2个矩阵A.B,我们使用标准的矩阵相乘定义C=AB如下: A数组中栏(column)的数目一定要等于B数组中列(row)的数目才可以做此2数组的相乘.若我们以rows(A) ...

  8. java 动态规划解决上楼梯问题

    问题描述: 你正在爬楼梯. 它需要n步才能达到顶峰. 每次你可以爬1或2步. 您可以通过多少不同的方式登顶? 注意:给定n将是一个正整数. Example 1: Input: 2 Output: 2 ...

  9. [leetcode] 45. 跳跃游戏 II(Java)(动态规划)

    45. 跳跃游戏 II 动态规划 此题可以倒着想. 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 ...

随机推荐

  1. nginx+php测试时显示 502 bad gateway的解决方法

    http://www.apelearn.com/study_v2/chapter18.html 由于阿铭老师的PHP版本是 5.3的   我装了 5.5 测试出现了 502  错误 查看日志   借助 ...

  2. sql语句查询重复数据

    select id, name, memofrom Awhere id in (select id from A group by id having count(1) >= 2)

  3. happynear_caffe编译时,缺少头文件caffe.pb.h的问题

    由于一些问题,需要编译caffe 的windows版本,用的是happynear的caffe版本,在caffe.pb.h遇到了问题 如何生成 caffe.pb.h 将protobuf 里的 proto ...

  4. vss和vs2008组合搭建源代码管理器

    用源代码管理项目,是为了方便开发和管理组内项目,一个组做的是同一套项目,彼此知道各个模块的进度和开发情况,这也是开发项目所需要的.今天整理了VSS的安装.创建.连接及添加项目等操作. 一.安装VSS( ...

  5. Spring Cloud Bus 消息总线 RabbitMQ

    Spring Cloud Bus将分布式系统中各节点通过轻量级消息代理连接起来. 从而实现例如广播状态改变(例如配置改变)或其他的管理指令. 目前唯一的实现是使用AMQP代理作为传输对象. Sprin ...

  6. ARP的一次请求与应答

    ARP: 我们知道,网络层和网络层以上使用的是IP地址,但在实际网络的链路上传送数据帧时,数据包首先是被网卡接受到再去处理上层协议的,所以最终还是必须使用该网络的硬件地址.但IP地址和下面的网络的硬件 ...

  7. 分布式事务之:TCC几个框架的测试情况记录

    国内主要的开源TCC分布式事务框架包括 框架名称 Github地址  star数量  tcc-transaction  https://github.com/changmingxie/tcc-tran ...

  8. Java-Runoob:Java String 类

    ylbtech-Java-Runoob:Java String 类 1.返回顶部 1. Java String 类 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 ...

  9. [转][Java]语法规范

    先来个 阿里的 Java 开发手册(2017.5.20 发布 v1.2.0 .pdf) 本文来自:http://blog.csdn.net/sinat_27115575/article/details ...

  10. Docker - 使用Swarm和compose部署服务(containers)

    前言 在之前使用Docker的过程中,一直是用 Docker run 命令单独启动container后再加入Overlay网络的方式实现部署工作的. 这种方式看似直接,但是随着服务所包含的contai ...