用动态规划算法编程实现数字三角形问题

这篇具有很好参考价值的文章主要介绍了用动态规划算法编程实现数字三角形问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用动态规划算法编程实现数字三角形问题

前言

一、用动态规划算法编程实现数字三角形问题

如下所示为一个数字三角形:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
请编一个程序计算从顶至底的某一条路径,使该路径所经过的数字的总和最大。

思路:建立两个二位数组m(用来存储数字三角形),sum(用来存储数字三角形中每一个值得路径值);sum[i] [j]从最后一行开始存储;
如果当前的行数i =数字三角形的行数row,那么这一行中sum的值与m的值对应相同;
如果 i < row ;那么sum[i][j] = max(m[i][j] + sum[i + 1][j], m[i][j] + sum[i + 1][j + 1]);
最终返回sum[1][1]即为所求的最大值。
用动态规划算法编程实现数字三角形问题

二、使用步骤

1.建立求最大值的函数

代码如下(示例):

int GetPath(int** m, int** sum, int row)
{
	cout << "每一步可沿直线向下或右斜线向下走;1<=三角形行数<=100;三角形中的数字为整数0,1,…,99" << endl;
	int i = row, j = 0;
	if (i == row)
		for (j = 1; j <= i; j++)
		{
			sum[i][j] = m[i][j];
		}
	for (i = row - 1; i > 0; i--)
	{
		for (j = 1; j <= i; j++)
		{
			sum[i][j] = max(m[i][j] + sum[i + 1][j], m[i][j] + sum[i + 1][j + 1]);
		}
	}
	cout << "输出每个值经过计算后的路径值" << endl;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= i; j++)
		{
			cout << setw(3) << sum[i][j];
		}
		cout << endl;
	}
	return sum[1][1];
}

2.读入数据:

用动态规划算法编程实现数字三角形问题

3.完整代码

#include <iostream>
#include <iomanip>
using namespace std;
//比较并返回最大值函数
int max(int a, int b)
{
	if (a > b) return a;
	else return b;
}
//自顶向下计算每一个值的路径值
int GetPath(int** m, int** sum, int row)
{
	cout << "每一步可沿直线向下或右斜线向下走;1<=三角形行数<=100;三角形中的数字为整数0,1,…,99" << endl;
	int i = row, j = 0;
	if (i == row)
		for (j = 1; j <= i; j++)
		{
			sum[i][j] = m[i][j];
		}
	for (i = row - 1; i > 0; i--)
	{
		for (j = 1; j <= i; j++)
		{
			sum[i][j] = max(m[i][j] + sum[i + 1][j], m[i][j] + sum[i + 1][j + 1]);
		}
	}
	cout << "输出每个值经过计算后的路径值" << endl;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= i; j++)
		{
			cout << setw(3) << sum[i][j];
		}
		cout << endl;
	}
	return sum[1][1];
}
int main()
{
	//创建一个数字三角形
	int row;//row行数
	int i = 0, j = 0;
	cout << "请输入三角形行数" << endl;
	cin >> row;
	//动态分配两个二位数组
	int** m = new int* [row];
	int** sum = new int* [row];
	for (i = 1; i <= row; i++)
	{
		m[i] = new int[row];
		sum[i] = new int[row];
	}
	//初始化m数组
	cout << "请输入m[i][j]中的值" << endl;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= i; j++)
			cin >> m[i][j];
	}
	cout << "从顶至底的某一条路径,使该路径所经过的数字的总和最大" << endl;
	int s = GetPath(m, sum, row);
	cout << "从顶至底的某一条路径,该路径所经过的数字的总和最大为" << s << endl;
}

4.输出结果

用动态规划算法编程实现数字三角形问题

总结

以上就是今天要讲的内容,本文仅仅简单介绍了用动态规划算法编程实现数字三角形问题问题。文章来源地址https://www.toymoban.com/news/detail-503531.html

到了这里,关于用动态规划算法编程实现数字三角形问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字三角形-蓝桥杯真题动态规划PYTHON解法

    目录 题目描述  解题思路 DP初始化 DP最终条件 DP初始条件 题目限制条件 总代码 首先映入我们眼帘的就是一个三角形,加求路径和最大,类似于找最短路径的题,很明显是一个二维数组的动态规划问题,对于动态规划问题我们只需要找好最终条件,初始条件(也就是特殊条件

    2024年02月09日
    浏览(23)
  • 力扣120. 三角形最小路径和(Java 动态规划)

    Problem: 120. 三角形最小路径和 Problem:64. 最小路径和 本题目可以看作是在上述题目的基础上改编而来,具体的思路: 1.记录一个int类型的大小的 n 乘 n n乘n n 乘 n 的数组(其中 n n n 为数组triangle的行数)用于记录 每一个当前阶段的最小路径和 2.大体上可以依据题意得出动态转移

    2024年01月22日
    浏览(29)
  • 【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

       611. 有效三角形的个数 https://leetcode.cn/problems/valid-triangle-number/ 给定一个包含非负整数的数组  nums  ,返回其中可以组成三角形三条边的三元组个数。 本题是一个关于三角形是否能成立的题目,首先我们假设三角形的三边(a,b,c),我们要保证两边之和大于第三边    题

    2024年02月12日
    浏览(38)
  • 【数字三角形】

    题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走

    2024年02月05日
    浏览(41)
  • 【数字三角形】(C++版)

    题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走

    2024年02月16日
    浏览(26)
  • 使用Python实现高效数据下采样:详解最大三角形三桶(LTTB)算法

    引言 在我们接触大规模的数据集时,数据的数量往往会让人望而却步。数据分析、机器学习等领域的专业人员需要对这些数据进行处理,以便更好地理解数据,以及利用数据进行预测。然而,处理大规模数据的计算成本往往非常高,这时候,就需要引入下采样(Downsampling)的

    2024年02月14日
    浏览(30)
  • AcWing 898. 数字三角形 (每日一题)

    像数组下标 出现 i-1 的,在循环的时候从 i=1 开始。 0x3f3f3f3f : 1061109567 Integer.MAX_VALUE : 2147483647 在选用 Integer.MAX_VALUE 时,很可能会出现 数据溢出 。 所以在用 Integer.MAX_VALUE 时 需要先取 MAX 再加 a[i][j]; 注:做 数字三角形 这题时, 初始化时需要注意一下边界 。 由于我们 状态计

    2024年02月11日
    浏览(29)
  • 数字三角形+包子凑数(蓝桥杯JAVA解法)

    题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述 输入的第一行包含一个整数 N (1≤N≤

    2024年02月01日
    浏览(28)
  • 【编程题】有效三角形的个数

    给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例1: 输入: nums = [2,2,3,4] 输出: 3 **解释:**有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 示例2: 输入: nums = [4,2,3,4] 输出: 4 构成三角形的条件 :任意两条边之和大于第三边,其

    2024年02月11日
    浏览(37)
  • 蓝桥杯第十一届省赛——数字三角形(python组)

    题目:数字三角形 【问题描述】: 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最 大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边

    2023年04月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包