算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

这篇具有很好参考价值的文章主要介绍了算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3-4数字三角形问题

(一)题目

问题描述

给定一个由 n n n行数字组成的数字三角形,如图所示。

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

试设计一个算法,计算从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

算法设计

对于给定的由 n n n行数字组成的数字三角形,计算从该三角形的顶至底的路径经过的数字和的最大值。

数据输入

由文件input.txt提供输入数据。文件的第1行是数字三角形的行数 n n n 1 ≤ n ≤ 100 1\leq n \leq 100 1n100 。接下来 n n n行是数字三角形各行中的数字,所有的数字在0~99之间。

结果输出

将计算结果输出到文件output.txt。文件的第1行中的数字是计算出的最大值。

(二)解答

方法思路

通过观察,我们可以看到:

数字三角形的最后一行上的数字到底的数字和最大的路径为该行上的数字本身;

数字三角形倒数第二行上的数字到底的数字和最大的路径为该行上的数字加上该行左下或右下的数字之和;

以此类推,我们可以从下往上推出数字三角形的顶至底的路径经过的数字和的最大值。

设该问题的子问题——从数字三角形中的第 i i i行,第 j j j列的数字出发至低端所经过的路径上的数字和的最大值为 t r i a n g l e ( i , j ) triangle(i,j) triangle(i,j),由最优子结构性质,可以建立计算 t r i a n g l e ( i , j ) triangle(i,j) triangle(i,j)的递归式如下:
t r i a n g l e ( i , j ) = { t r i a n g l e ( i , j ) ,    i = n t r i a n g l e ( i , j ) + m a x { t r i a n g l e ( i + 1 , j ) , t r i a n g l e ( i + 1 , j + 1 ) } , 1 ≤ i < n triangle(i,j)=\begin{cases} triangle(i,j),\;\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \qquad \qquad \quad \qquad i=n\\ triangle(i,j)+max\{triangle(i+1,j),triangle(i+1,j+1)\},\qquad 1\leq i<n\\ \end{cases} triangle(i,j)={triangle(i,j),i=ntriangle(i,j)+max{triangle(i+1,j),triangle(i+1,j+1)},1i<n
按此递归式计算出的 t r i a n g l e ( 1 , 1 ) triangle(1,1) triangle(1,1)即为所求。

举例

算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

源代码
#include<iostream>
#include<cstdio>
#include<fstream>

using namespace std;

int n; //数字三角形行数
int triangle[101][1001]; //数字三角形数组
int s[101]; //路径数组

//读取
void Read(); 
//写入
void Write();
//求解从三角形顶端到底端的路径所经过的数字和的最大值
void Solution(int n, int triangle[][1001]);
//求解路径数组
void TrackBack(int n, int triangle[][1001]);

int main()
{
    //读取
    Read();
    //求解从三角形顶端到底端的路径所经过的数字和的最大值
    Solution(n, triangle);
    //写入
    Write();
    //输出最优解路径
    TrackBack(n, triangle);
    for (int i = 1; i <= n; ++i)
    {
        cout<<s[i]<<" ";
    }
    cout<<endl;
    return 0;
}

void Read()
{
    ifstream ifs;
    //打开输入文件
    ifs.open("G:\\algorithm\\data\\3_4_input.txt", ios::in);
    //读取数据
    ifs>>n;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= i; ++j)
        {
            ifs>>triangle[i][j];
        }
    }
    //关闭输入文件
    ifs.close();
}

void Write()
{
    ofstream ofs;
    //创建输出文件
    ofs.open("G:\\algorithm\\data\\3_4_output.txt", ios::out);
    //写入数据
    ofs<<triangle[1][1]<<endl;
    //关闭输出文件
    ofs.close();
}

void Solution(int n, int triangle[][1001])
{
    //从下往上计算
    for (int i = n - 1; i >= 1; --i)
    {
        for (int j = 1; j <= i; ++j)
        {
            triangle[i][j] += max(triangle[i + 1][j], triangle[i + 1][j + 1]);
        }
    }
}

void TrackBack(int n, int triangle[][1001])
{
    //从上往下计算
    int i, j, maxium;
    i = j = 1;
    while(i < n)
    {
        if (triangle[i + 1][j] > triangle[i + 1][j + 1])
        {
            s[i] = triangle[i][j] - triangle[i + 1][j];
            i = i + 1;
            j = j;
        }
        else
        {
            s[i] = triangle[i][j] - triangle[i + 1][j + 1];
            i = i + 1;
            j = j + 1;
        }
    }
    s[i] = triangle[i][j];
}
结果示例

输入:

算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

输出:

算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

(三)复杂度分析

读取函数Read()中有两个循环的总次数为 ∑ i = 1 n i = n ( n + 1 ) 2 \sum_{i=1}^ni=\frac{n(n+1)}{2} i=1ni=2n(n+1),因此时间复杂度为 O ( n 2 ) \Omicron(n^2) O(n2)

写入函数Write()中的时间复杂度为 O ( c ) \Omicron(c) O(c)

求最优解函数Solution()中两个循环的总次数为 ∑ i = 1 n i = ( n − 1 ) n 2 \sum_{i=1}^ni=\frac{(n-1)n}{2} i=1ni=2(n1)n,因此时间复杂度为 O ( n 2 ) \Omicron(n^2) O(n2)

求最优解路径函数TrackBack()中循环的次数为 n − 1 n-1 n1,因此时间复杂度为 O ( n ) \Omicron(n) O(n)

因此,整个算法的时间复杂度为 O ( n 2 ) \Omicron(n^2) O(n2)文章来源地址https://www.toymoban.com/news/detail-409915.html

到了这里,关于算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

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

    2024年02月09日
    浏览(39)
  • 符号三角形-计算机算法设计与分析【1600+字解析 dfs全排列 列举情况】【题意分析】【算法分析】【思路是怎么来的】【过程是什么】

    下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。 在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。 题意分析 也就是 给

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

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

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

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

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

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

    2024年02月16日
    浏览(65)
  • 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日
    浏览(40)
  • 数字三角形+包子凑数(蓝桥杯JAVA解法)

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

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

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

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

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

    2023年04月10日
    浏览(48)
  • C语言程序设计:输入一个三角形的三条边长,求出三角形的面积。

    已知三角形的三边长a,b,c,则该三角形的面积公式为:           area=  其中s = (a+b+c)/2

    2024年02月06日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包