动态规划入门-重叠子问题-状态转移方程-数塔问题

本文通过斐波那契数列和数塔问题阐述动态规划的概念,指出重叠子问题和最优子结构是使用动态规划解决此类问题的两个关键要素。动态规划通过记录子问题的解,避免重复计算,优化复杂度,从O(2^n)降至O(n)。同时,文章展示了如何构建状态转移方程并从边界条件开始自底向上解决问题。动态规划方法不仅适用于数学问题,也在计算机科学的多个领域中有广泛应用。
摘要由CSDN通过智能技术生成

记录重叠子问题的解

以计算Fibonacci数列为例,最简单粗暴的算法是

int F(int n)
{
   
    if(n == 0 || n == 1)
        return 1;
    else
        return F(n - 1) + F(n - 2);
}

例如计算F(5)时,如图,有大量重复计算,造成效率低下,复杂度高达O(2n)

image-20210224230120742image-20210225215449852

如果我们建立一个数组dp[n]表示F(n)的数值,尚未计算的设置为-1,那么当碰到计算相同内容的时候,就可以直接使用之前的计算结果,即每个F(n)现在至多只需计算一次,复杂度优化至O(n)

int dp[MAX]

int F(int n)
{
   
    if(n == 0 || n == 1)
        return 1;
    if(dp[n] != -1)
        return dp[n];	//已计算过,直接返回结果
    else
    {
   
        dp[n] 
Description 在讲动态规划课时,我们知道可用动态规划算法问题应具备的一个基本要素是问题重叠性质,矩阵连乘问题能用动态规划正是因为它具有重叠问题。因此在矩阵连乘问题的自顶向下的递归算法中,存在着大量的重叠问题计算。例如要计算4个矩阵A1A2A3A4最小连乘次数,要分别计算A1(A2A3A4)、(A1A2)(A3A4)和(A1A2A3)A4三种情况下的最小连乘次数,而计算A1(A2A3A4)的最小连乘次数要计算其问题A2A3A4的最小连乘次数,A2A3A4最小连乘次数的计算有二种情况(A2A3)A4和A2(A3A4),它分别包括A2A3和A3A4两个问题。同理,计算(A1A2)(A3A4)包含A1A2和A3A4两个问题;计算(A1A2A3)A4包含计算A1A2A3、A1A2和A2A3这三个问题。故在A1A2A3A4的最小连乘次数时,其问题的计算和重叠次数分别是: A1A2计算2次,重叠1次;A2A3计算2次,重叠1次;A3A4计算2次,重叠1次;A1A2A3只计算1次;A2A3A4只计算1次;A1A2A3A4只计算1次。因此,4个矩阵A1A2A3A4连乘的重叠问题分别为:A1A2、A2A3和A3A4的计算各重叠一次。现在你的编程任务是:对于n个矩阵连乘,重叠问题的计算次数。 Input 第一行是1个整数n(2≤n≤300),表示有n个矩阵连乘,接下来一行有n+1个数,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开. Output 输出重叠问题计算次数和对应的问题,中间以空格隔开,各问题重叠次数输出分别以A1、A2、… An打头的次序依次输出,格式如样例所示。如没有重叠问题输出NO Sample Input 4 30 35 15 5 10 Sample Output 1 A1A2 1 A2A3 1 A3A4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值