C++动态规划解决数字三角形问题

问题描述

在这里插入图片描述找出数字三角形从上至下直接相邻的数字的最大和,每一行只能选出一个数字。

题目分析

我们按照一个一个类似矩阵的形式输入我们的数据,为了防止开辟多余的空间,我们直接在原输入的半矩阵上进行操作。
这个问题最好的办法应该是自底向上来寻找最大加和,因为如果自顶向下加和的话,我们会发现,会出现下面的两个数据公用上面一个数据的情况,我们不好决定这个数据加到下一行的哪个数据上,如果单纯地只是找下一行较大的数相加的话,由于不知道后几行的数字变化,所以这种方法并不对。因为有可能这个较大数字的后面几行相邻数字非常小。类似第2行的8后面的数字。
自底向上的方法,是将下一行的值加到当前行,并对当前行的数进行更新,在这里我们先从第3行开始。
我们要将第4行的数加到第3行的数上,但是又不能盲目地全部加进去,应该有选择地加入。具体看下图:
在这里插入图片描述
我们从倒数第二行开始,找它的下一行相邻的两个数中的较大值与当前行的值相加,即

array[row][col] += max(array[row+1][col],array[row+1][col+1])

代码

#include <iostream>
using namespace std;
int main()
{
    int n;//行数
    cin>>n;
    int array[n][n];
    int number;
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < i + 1;j++)
        {
            cin>>array[i][j];
        }
    }
    for(int row = n - 2;row >= 0;row--)
    {
        for(int col = 0;col <= row;col++)
        {
            if(array[row+1][col] > array[row+1][col+1])
                array[row][col]+=array[row+1][col];
            else
                array[row][col] += array[row+1][col+1];
        }
    }
    cout<<array[0][0];
    return 0;
}

总结

时间复杂度O(n^2)
空间复杂度O(n^2)

发布了60 篇原创文章 · 获赞 2 · 访问量 1040

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105586981
今日推荐