动态规划训练一

Posted ACMfans Club

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划训练一相关的知识,希望对你有一定的参考价值。

Problem A --- 最长公共子序列

动态规划训练一

解析:

    Xi 代表{x1,x2,x3,...,xi},Y代表{y1,y2,y3,...,yj},求长度分别为m,n的两个序列X,Y的LCS,就相当于求Xm和Yn的LCS。

    考虑以下两种情况:

    1. xm = yn 时,在Xm-1 与 Yn-1 的LCS后面加上xm(或yn)就是Xm与Yn的LCS。

    2. 否则,Xm-1与Yn的LCSXm与Yn-1的LCS更长的一方就是Xm和Yn的LCS。

    

设计如下递推式:

    1. 定义 c[m+1][n+1] 二维数组,其中c[i][j]代表Xi和Yi的LCS长度

    2. 

        c[i][j] = 0 (i=0 or j = 0)

        c[i][j] = c[i-1][j-1] + 1 (i,j > 0 and xi = yi)

        c[i][j] = max{ c[i-1][j], c[i][j-1] } (i,j > 0 and xi != yi)


reference code

动态规划训练一


Problem B --- 矩阵链乘

动态规划训练一

动态规划训练一

解析:

    矩阵的结合律导致了按不同的结合顺序计算矩阵乘法的时候,乘法的计算次数会有所不同。

动态规划训练一

动态规划训练一


Reference Code

动态规划训练一


Problem C --- 硬币问题

动态规划训练一

动态规划训练一

动态规划训练一

Reference Code

动态规划训练一


Problem D --- 最长递增子序列

动态规划训练一

动态规划训练一

解析:

L[n+1] 一维数组,L[i] 为由A[1]到A[i] 中的部分元素构成且最后选择了A[i]的LIS长度。

P[n+1] 一维数组,P[i]为由A[1]到A[i] 中的部分元素构成且最后选择了A[i]的LIS的倒数第二个元素的位置(记录当前已得出的最长递增子序列中,各元素前面一个元素的位置)


Reference Code





以上是关于动态规划训练一的主要内容,如果未能解决你的问题,请参考以下文章

NOIP训练营动态规划内部训练题!

动态规划训练一

LeetCode动态规划训练营(1~5天)

动态规划训练之三

算法竞赛入门经典--例题和课后训练(动态规划)

动态规划训练之十九