`
MouseLearnJava
  • 浏览: 466000 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[动态规划] 数字三角形问题(一维数组实现)

阅读更多
数字三角形问题:一个数字三角宝塔。设数字三角形中的数字为不超过100的正整数。现规定从最顶层走到最底层,每一步可沿左斜线向下右斜线向下走。假设三角形行数小于等于100.编程求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和最大,输出最大值

例如一个行数为5的三角形如下:
               7
             3   8
           8   1   0
         2   7   7   4
       5   5   2   6   5


这一个问题,很容易想到用枚举的方法去解决,即列举出所有路径并记录每一条路径所经过的数字总和。然后寻找最大的数字总和,这一想法很直观,也比较容易实现。不过,缺点是:当行数很大时,比如行数等于100,其枚举量是相当巨大的。

这是一个多阶段决策性的问题--> 最优路径上的每一个数字开始的向下的路径也是该数字到最下层的最优路径,符合最优化原理,可以考虑用动态规划的方法实现。

本文采用一维数组去求解数字三角形问题,并用上述行数为5的三角形作为实例来求解。

/**
 * 
 * @author Eric
 *
 */
public class TriangleProblem {

	/**
	 * 使用一维数组结合动态规划思想求解数字三角形问题。
	 * @param array 存储三角形数字的一维数组(从上到下,从左到右存储)
	 * @param n 数字三角形的行数
	 * @return 返回一个经过路径的数字的总和最大值
	 */
	public int populateMaxSum(int[] array, int n) {
		int[] result = new int[array.length];
		
		for (int row = 0; row < n; row++) {
			if (row == 0) {
				/*
				 * 设置定点的值 
				 */
				result[0] = array[0];
			} else {
				int rowStartIndex = populateStartRowIndex(row);
				
				/*
				 * 设置第row行第一个位置到顶点的最大值只有一个。
				 * 直接赋值。
				 */
				result[rowStartIndex] = array[rowStartIndex]
						+ result[rowStartIndex - row];

				for (int col = 1; col <= row; col++) {
					
					if (col < row) {
						/*
						 * 处理到顶点的数值有两个节点的位置,
						 * 取大的那一个。
						 */
						result[rowStartIndex + col] = max(result[rowStartIndex
								- row + col - 1]
								+ array[rowStartIndex + col],
								array[rowStartIndex + col]
										+ result[rowStartIndex - row + col]);
					} else {
						
						/*
						 * 每行最右边的的位置到顶点的最大值也只有一个。
						 * 此时 row == col
						 * 直接赋值。
						 */
						result[rowStartIndex + col] = result[rowStartIndex
								- row + col - 1]
								+ array[rowStartIndex + col];
					}

				}
			}
		}
		/*
		 * 当所有的位置到顶点的位置都计算出来之后,
		 * 要计算出最大值,只要计算最大行中最大值即可。
		 * 
		 */
		return max(populateStartRowIndex(n - 1), result);
	}

	/**
	 * 根据一个指定的行号,计算出在一维数组中对应的下标,最为该行的起始下标
	 * @param row 行号(从0开始)
	 * @return
	 */
	private int populateStartRowIndex(int row) {
		int sum = 0;
		for (int i = 0; i <= row; i++) {
			sum += i;
		}
		return sum;
	}

	private int max(int startIndex, int[] array) {
		int max = array[startIndex];

		for (int i = startIndex; i < array.length; i++) {
			if (array[i] > max) {
				max = array[i];
			}

		}
		return max;
	}

	private int max(int v1, int v2) {
		return (v1 > v2) ? v1 : v2;
	}
}


测试代码==>
public class Main {

	public static void main(String[] args) {
		TriangleProblem tp = new TriangleProblem();
		int[] array = { 7, 3, 8, 8, 1, 0, 2, 7, 4, 4, 4, 5, 2, 6, 5 };
		System.out.printf("最大和为 SUM=%d", tp.populateMaxSum(array, 5));
	}
}

输出结果==>
最大和为 SUM=30

当然,我们可以将三角形中的数据保存到文件中,然后读取文件的内容,再将这些数字初始化到一维数组中去,这里就不再展开。

比如,将三角形数据存在到一个txt文件中,数字之间用空格隔开
7
3 8
8 1 0
2 7 7 4
5 5 2 6 5
... ...

转载请注明出处:http://mouselearnjava.iteye.com/blog/1964219
2
0
分享到:
评论

相关推荐

    用二维数组实现杨辉三角

    具体到代码实现,我们首先定义了一个二维数组`a[N][N]`,其中`N`为常量,定义了三角形的最大层数。接下来,通过循环填充这个数组,实现杨辉三角的计算: 1. **初始化**:将二维数组的第一列和主对角线元素设置为1,...

    C++二维数组实现杨辉三角的前10行输出

    它是由一系列数字组成的一个三角形数组,每个数字是上一行相邻两个数字的和。在中国,这个概念最早由北宋时期的数学家贾宪提出,并在南宋时期由杨辉加以推广和发展,因此在中国被称作“杨辉三角”。 #### 实现原理 ...

    杨辉三角-一维数组实现

    在这里,我们将探讨如何使用C语言通过一维数组来实现杨辉三角。 首先,我们需要理解C语言的基本数据结构,特别是数组。数组是一种线性数据结构,允许我们存储相同类型的数据集合。在C语言中,一维数组可以看作是一...

    动态分割 数字三角形

    数字三角形中的数字为不超过100的整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。  任务一:假设三角形行数≤10,键盘输入一个确定的整数值M,编程确定是否存在一条路径,使得沿着该路径所...

    动态规划 数字三角形

    本文将围绕“数字三角形”这一具体应用场景,详细介绍如何运用动态规划解决此类问题,并通过C语言实现算法。 #### 动态规划基础概念 动态规划的核心思想是将复杂问题分解成一系列简单的子问题,通过求解这些子问题...

    二维数组实例代码

    每个一维数组中的元素都可以是另一个一维数组,这样的结构可以用来表示矩阵或者表格等多维度的数据。 #### 二、求矩阵最大值及位置 ##### 实验目的 本实验旨在通过编写程序来找出一个给定矩阵(本例中为3×4)中的...

    实验七 二维数组

    在C语言中,二维数组可以被看作是一组一维数组的集合,它通常用来表示矩阵或者表格等具有行和列结构的数据。二维数组的声明方式是:`类型标识符 数组名[行数][列数];`,例如:`int a[3][4];` 这个声明创建了一个3行4...

    数字三角形问题

    解决这个问题,程序员通常会使用动态规划方法,创建一个二维数组来存储到达每个位置的最小成本。从上到下,从左到右,以及从上到下,从右到左遍历每个元素,更新相邻元素的最小和。最后,数组底部的值就是最小路径...

    c语言杨辉三角 (二维数组).zip

    - 二维数组可以看作是多个一维数组的集合,每个一维数组代表一行。在C语言中,声明一个二维数组的基本语法是`类型 数组名[行数][列数]`。例如,我们可以声明一个3行4列的二维数组为`int arr[3][4]`。 - 数组的索引...

    数字三角形问题程序算法

    可以通过一个一维数组`t[]`记录每个阶段选择的位置,从而还原出最优路径。 #### 代码实现 ```c #include int main() { int i, j, N; int a[100][100], b[100][100]; int t[100]; // 输入数字三角形的行数 ...

    动态规划,数字三角形 最大子段和问题 最长公共子序列

    1. **最大子段和问题**:这是一个经典的动态规划问题,其目标是在一个整数数组中找到连续子数组的最大和。这个问题可以通过 Kadane's Algorithm 来解决。该算法有两种主要策略:始终保持当前子数组的最大和以及在...

    算法分析设计题—数字三角形问题

    本题中提到的“数字三角形问题”是一个典型的动态规划问题,旨在寻找从数字三角形的顶部到底部的路径,使得路径上的数字之和最大。 数字三角形问题的描述如下:给定一个由 n 行数字构成的三角形,每一行由若干个...

    Number Triangles 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

    - **优化方向**:如果需要进一步优化,可以考虑减少空间占用,例如只使用一维数组来存储当前行和前一行的数据,从而将空间复杂度降低到 \( O(n) \)。 ### 总结 本题是一个典型的动态规划问题,在实际编程竞赛或面试...

    利用二维数组打印杨辉三角形.docx

    如标题和描述所提到的,这里使用了队列数据结构来打印杨辉三角形,但实际上,这个例子中并没有涉及队列,而是使用了一个简单的二维数组来实现。下面我们将详细讨论如何利用二维数组来构建杨辉三角形,并分析代码中的...

    数字三角形(C语言编写) 算法

    在编程领域,数字三角形是一种有趣的算法问题,它涉及到路径搜索和动态规划。在这个问题中,我们有一个由数字构成的三角形,目标是从顶部到底部找到一条路径,使得经过的数字之和最大。通常,每次移动只能从当前所在...

    基于C实现的N阶数字正方形 ;N阶数字三角形;N阶数字递减三角形;乘法表

    实现时,可以使用动态规划,用二维数组存储每一步的结果,每次计算新行的数字时,根据上一行的数字进行累加。 3. **N阶数字递减三角形**: 这种结构与数字三角形类似,但每个数字是其上方两个数字之差,如果上方...

    c++ 蛇形数组 倒三角

    本题要求使用C++语言实现一个数字倒三角形的蛇形数组,并将结果输出到TXT文件中。 首先,我们来详细理解蛇形数组的生成过程。假设我们有一个n×n的二维数组,我们从左上角开始,依次填入数字1、2、3……,当一行或...

    数据结构 杨辉三角形

    在使用一维数组实现杨辉三角形时,需要考虑到数组之间的动态更新。具体步骤如下: 1. **初始化**:根据用户输入的行数 n,创建一个大小为 n 的一维数组 a,用于存储当前行的值。 2. **计算与输出**:对于每一行 i,...

    java,Spring实现ACM国际大学生程序设计竞赛试题 数字三角形

    在Java编程语言中,我们可以创建一个二维数组来表示数字三角形,然后用动态规划的思想来解决。动态规划的核心是将问题分解为子问题,并存储每个子问题的解以避免重复计算。在这里,我们可以维护一个二维数组dp,其中...

Global site tag (gtag.js) - Google Analytics