动态规划-重叠子问题

动态规划-重叠子问题

flyfish 2015-8-23

名词解释
重叠子问题 overlapping subproblems

动态规划策略将问题分解为一个或者多个子问题

重叠子问题是一个递归解决方案里包含的子问题虽然很多,但不同子问题很少。少量的子问题被重复解决很多次。

例如LCS(最长公共子序列)问题,给定两个序列X和Y,长度分别是m和n,穷举子问题是指数级的,而不同子问题的数量只是mn.

a recurisive algorithn for the problem solves the same subproblems over and over,rather than always generating new subproblems.
用来解原问题的递归算法可以反复地解同样的子问题,而不是总在产生新的子问题。

over and over 反复,再三
rather than 而不是;宁可…也不愿

When a recursive algorithm revisits the same problems repeatedly,we say that the optimization problem has overlapping subproblems.
当一个递归算法不断地调用同一问题时,我们说该最优问题包含重叠子问题

revisit 英 [riː’vɪzɪt] 美 [ri’vɪzɪt]
vt. 重游;再访;重临
n. 再访问

repeatedly 英 [rɪ’piːtɪdlɪ] 美 [rɪ’pitɪdli]
adv. 反复地;再三地;屡次地

In contrast, a problem for which a divide-and-conquer approach is suitalbe usually generates brand-new problems at each step of the recursion.
相反地,适用于分治法解决问题往往在递归的每一个步上都产生全新的问题。

contrast英 [‘kɒntrɑːst] 美 [‘kɑntræst]
vi. 对比;形成对照
vt. 使对比;使与…对照
n. 对比;差别;对照物

divide-and-conquer
分治法

approach 英 [ə’prəʊtʃ] 美 [ə’protʃ]
n. 方法;途径;接近
vt. 接近;着手处理
vi. 靠近

suitable 英 [‘suːtəb(ə)l] 美 [‘sutəbl]
adj. 适当的;相配的

brand-new
adj. 崭新的;最近获得的

brand 英 [brænd] 美 [brænd]
vt. 铭刻于,铭记;打烙印于;印…商标于
n. 商标,牌子;烙印

以斐波那契数列为例说明

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13
从第3个数开始,每个数都是前面两个数之和。
测试时 输入的 n>=3,但也不要太大,防止溢出。
递归式

Consider again the recursive function for computing the nth Fibonacii number
.
再次考虑使用递归函数计算第n个斐波那契数。

    int Fibonacci(int n)
    {
        if( (1==n) || (2==n) )
        return 1;

        return Fibonacci(n-1) + Fibonacci(n-2);     
    }

调用 Fibonacci(7);

存表方式
动态规划算法总是充分利用重叠子问题,即通过每个子问题只解一次,把解保存在一个需要时就可以查看的表中,而每次查表的时间为常数。
Dynamic-programming algorithms typically take advantage of overlapping subproblems by solving each subproblem once and then storing the solution in a table where it can be looked up when needed, using constant time per lookup.

typically 英 [‘tɪpɪkəlɪ] 美 [‘tɪpɪkli]
adv. 代表性地;作为特色地,典型地

take advantage of
利用

    int Fibonacci(int n,int* Values)
    {
        if(n<=2)
        return 1;

        Values[n]=Fibonacci(n-1,Values) + Fibonacci(n-2,Values);

        return  Values[n];  
    }

调用
int Values[8]={0,0,0,0,0,0,0,0};
Fibonacci(7,Values); 

不需要表存储所有值,只存储前两个值

int Fibonacci(int n)
    {
        long past,prev,curr;
        past=prev=curr=1;

        for(int i=3;i<=n;i++)
        {
            past=prev;      // past holds Fibonacci(i-2)
            prev=curr;      // past holds Fibonacci(i-1)
            curr=past+prev; // current now Fibonacciholds (i)
        }
        return curr;

    }


调用 Fibonacci(7);
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值