动态规划算法之数塔问题

package cn.gldwolf.bigdata;/*
3
12  56
23  4   78
34  69  34  19
12  3   54  12  34
*//*
思路:从最底层往上走,判断下层两个节点中的最大值,
并将最大值与上层节点中的值相加得到这一步的最大值,
将最大值保存到新的数塔中
再判断上层节点的的两个节点的最大值,
再与上上层的节点相加,再保存到新的数塔中,
如此循环往复,最终得到顶层节点的值一定为最大值。输出路径时:
将两个数塔相减,得到下一个节点的值,
下一个节点的值的下标要么和上层节点的下标一致,
要么为上层节点的下标 +1
*/import java.util.Scanner;public class NumberTower {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("Please input the tower height: ");int height = input.nextInt();int firIndex = height - 1; // 数组的长度int[][] orignal = new int[height][]; // 原始的数塔数组int[][] ultima = new int[height][]; // 求最大值以后的数塔数组System.out.println(orignal.length);System.out.println("Please input the number for the number tower: ");// 生成数塔数据for (int i = 0; i < orignal.length; i++) {orignal[i] = new int[i + 1];for (int j = 0; j <= i; j++) {orignal[i][j] = input.nextInt();}}createUltimaArray(firIndex, orignal, ultima);printTrace(firIndex, orignal, ultima);}// 生成求完最大值后的数塔数组public static void createUltimaArray(int firIndex, int[][] orignal, int[][] ultima) {// 将原始数塔中的数据加载到 ultima 数塔中for (int i = 0; i < orignal.length; i++) {ultima[i] = new int[i + 1];for (int j = 0; j <= i; j++) {ultima[i][j] = orignal[i][j];}}// 定义一个临时变量保存下层节点中两个值中的最大值int temp_max;// 判断下层两个节点中的最大值,并将最大值与节点中的原始数值相加并保存for (int i = firIndex - 1; i >= 0; --i) {for (int j = 0; j <= i; ++j) {temp_max = Math.max(ultima[i + 1][j], ultima[i + 1][j + 1]);ultima[i][j] = temp_max + orignal[i][j];}}}public static void printTrace(int firIndex, int[][] orignal, int[][] ultima) {int max = ultima[0][0];System.out.print(orignal[0][0]); // 第一个节点的值是确定的int j = 0; // 确定初始的二维下标,并提供后续控制  // 这个地方很关键// 循环判断for (int i = 1; i <= firIndex; i++) {// 用 ultima 数组和 orginal 数组相减,得到其子节点在 ultima 数组中的值int node = ultima[i - 1][j] - orignal[i - 1][j];// 因为对上层节点而言,其子节点只有两个,要么和它下标一致,要么为其下标 +1if (node != ultima[i][j])  // 判断,如果和它相同的下标不对,则对下层的下标 +1++j;System.out.print(" --> " + orignal[i][j]);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Log4j 配置详解

1. Log4j 简介 Log4j 有三个主要的组件&#xff1a; Loggers&#xff08;记录器&#xff09;&#xff1a;日志类别和级别 Appenders&#xff08;输出源&#xff09;&#xff1a;日志要输出的地方 Layouts&#xff08;布局&#xff09;&#xff1a;日志以何种形式输出 1.1 Log…

Iterator主要有三个方法:hasNext()、next()、remove()详解

Iterator主要有三个方法&#xff1a;hasNext()、next()、remove()详解 一、Iterator的API 关于Iterator主要有三个方法&#xff1a;hasNext()、next()、remove()hasNext:没有指针下移操作&#xff0c;只是判断是否存在下一个元素next&#xff1a;指针下移&#xff0c;返回该指…

Java获取登录用户IP地址

Java获取登录用户IP地址 /*** param * return * throws * description * author wqd* date 2021/9/21 13:45*/public static String getIpAddr(HttpServletRequest request) {String ip request.getHeader("x-forwarded-for");if (ip null || ip.length() 0 || &q…

Kafka Shell 基本操作

1. 启动集群每个节点的进程 nohup kafka-server-start.sh \ /home/hadoop/apps/kafka_2.11-1.1.0/config/server.properties \ 1>~/logs/kafka_std.log \ 2>~/logs/kafka_err.log &2. 创建 Topic 解释说明&#xff1a; –create --> 创建 Topic 的选项 –zookee…

Spark 简介

1. 什么是 Spark 官网&#xff1a;http://spark.apache.org Spark 是一个快速、通用、可扩展的大数据分析引擎。 Spark 是基于内存计算的大数据并行计算框架 1.1 Spark 的特点 快&#xff1a;与 Hadoop 的 MapReduce 相比&#xff0c;Spark 基于内存的运算要快 100 倍以上&a…

Linux环境下安装Mysql5.7

本文记录下我近期在Linux环境下安装Mysql5.7的实践经历。 服务器版本Mysql版本Centos 7.65.7.32 1. 下载Mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 进入页面后选择你需要的版本进行下载&#xff0c;这里提供了2种格式&#xff1a;tar.gz和…

Redis 入门及实战

目录 1. Redis 基本概念 2. Redis 的优势 3. Redis 适用场景 4. Redis-3.2.6 安装(未整理)与测试 5. 使用 Redis 的 Java API 客户端——Jedis 6. 数据结构 6.1 String -- 字符串 6.1.1 String 使用概述 6.1.2 String 常用操作 6.1.3 String 使用案例 6.2 List -- 列…

HBase 简介

HBase 是一个通过大量廉价机器解决海量数据的调整存储和读取的分布式数据库解决方案 HBase 的特点&#xff1a; 高并发&#xff0c;易扩展&#xff0c;解决海量数据集的随机实时增删改查HBase 本质依然是 Key-Value 数据库&#xff0c;不支持 join 等复杂操作不支持复杂的事务…

Flink官网自学笔记

1. What is Apache Flink? Apache Flink 是一款用来进行分布式流数据和批数据处理的开源平台。Apache Flink 是一个对有界数据流和无界数据流进行有状态计算的框架和分布式处理引擎。Flink 被设计用于在所有常见的集群环境中运行&#xff0c;以内存中的速度和任意规模进行计算…

HBase Java API 代码开发

1. API 介绍 几个主要 HBase API 类和数据模型之间的对应关系&#xff1a; Java 类 HBase 数据模型 Admin 数据库&#xff08;Database&#xff09; HBaseConfiguration Table 表&#xff08;Table&#xff09; HTableDescriptor 列簇&#xff08;Column Family&#…

HBase 原理

1. HBase 底层原理 1.1 系统架构 1.1.1 Client 职责 1. HBase 有两张特殊的表&#xff1a; .META.: 记录了用户所有表拆分出来的 Region 映射信息&#xff0c;.META. 可以有多个 Region -ROOT-(新版中已去掉这一层): 记录了 .META. 表的 Region 信息&#xff0c;-ROOT- 只有…

用IDEA debug按键功能

用IDEA debug按键功能 一、断点 断点键&#xff0c;是用户在所选行代码处标记的功能点&#xff0c;表示在debug时代码执行到此处暂停。 注&#xff1a;断点可设置多个 二、启动debug 在设置好断点后单击此功能键&#xff0c;启动debug功能。 三、中止任务 点击该功能键&a…

HBase 的表设计

1 ColumnFamily 设计 追求的原则是&#xff1a;在合理的范围内能尽量少的减少列簇就尽量减少列簇。 最优设计是&#xff1a;将所有相关性很强的 Key-Value 都放在同一个列簇下&#xff0c;这样既能做到查询效率最高&#xff0c;也能保持尽可能少的访问不同的磁盘文件。 以用…

shiro原理及其运行流程介绍

什么是shiro shiro是apache的一个开源框架&#xff0c;是一个权限管理的框架&#xff0c;实现 用户认证、用户授权。 spring中有spring security (原名Acegi)&#xff0c;是一个权限框架&#xff0c;它和spring依赖过于紧密&#xff0c;没有shiro使用简单。 shiro不依赖于sp…

shiro中文api_Shiro

1 shiro Apache shiro 是一个 Java 安全框架。 功能&#xff1a;认证、授权、加密和会话管理功能 应用环境&#xff1a;JavaEE、JavaSE Subject 可看做成一个用户 SecurityManager 框架的核心API Reaim 域对象&#xff0c;用于取数据库中的数据&#xff0c;进行权限比对。…

Java Lambda 表达式讲解

Lambda 表达式 Lambda 表达式的基础语法 Java8 中引入了一个新的操作符&#xff1a;-> 该操作符称为箭头操作符或者 Lambda 操作符 Lambda 操作符将表达式拆分成两部分&#xff1a; 左侧&#xff1a;Lambda 表达式的参数列表右侧: Lambda 表达式的"函数体" --&…

方法引用、构造器引用和数组引用

方法引用 若 Lambda 体中的内有方法已经实现了&#xff0c;我们可以使用“方法引用”&#xff08;可以理解为方法引用是 Lambda 表达式的另外一种表现形式&#xff09; 语法格式 主要有以下三种语法格式&#xff1a; 对象&#xff1a;&#xff1a;实例方法名 注意&#xff1…

JVM 学习一:JVM 的构架模型及生命周期

JVM 的架构模型 Java 编译器输入的指令流基本上是一种基于栈的指令集架构&#xff0c;另外一种指令集架构则是基于寄存器的指令集架构。 具体来说&#xff0c;这两种架构之间的区别&#xff1a; 基于栈式架构的特点&#xff1a; 设计和实现更简单&#xff0c;适用于资源受限…

JVM 学习二:类加载器子系统

1 类加载器子系统的作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件&#xff0c;Class 文件在文件开关有特定的文件标识ClassLoader 只负责 Class 文件的加载&#xff0c;至于它是否可以运行&#xff0c;则由 Execution Engine&#xff08;执行引擎&#xff09;决…

JVM 学习三:类加载器

类加载器 1 类加载器的分类 JVM 支持两种类型的类加载器&#xff1a;引导类加载器&#xff08;Bootstrap ClassLoader&#xff09;和自定义类加载器&#xff08;User-Defined ClassLoader&#xff09; 从概念上来讲&#xff0c;自定义类加载器一般指的是程序中由开发人员自定…