动态规划训练一
Posted ACMfans Club
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划训练一相关的知识,希望对你有一定的参考价值。
Problem A --- 最长公共子序列
解析:
Xi 代表{x1,x2,x3,...,xi},Yj 代表{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的LCS和Xm与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
以上是关于动态规划训练一的主要内容,如果未能解决你的问题,请参考以下文章