动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但是经过分解得到的子问题往往不是相互独立的。在用分治法求解的时候,子问题被重复计算了多次。
解决方法:保存已解决的子问题的答案,避免大量重复计算。
动态规划与分治法区别
- 适用于动态规划算法的问题,经分解得到的子问题往往不是相互独立的。若用分治法求解,则分解得到的子问题数目太多,最终导致原问题需要指数时间。
- 虽然子问题数目只有多项式量级,但用分治法求解时,子问题被重复计算多次。
- 动态规划的基本思想:构造一张表来记录所有已解决的子问题的答案。
动态规划算法的基本步骤
- 找出最优解的性质(分析其结构特征)
- 递归定义最优值(优化目标函数)
- 自底向上得到最优值
- 根据计算最优值得到的信息,构造最优解。
两个矩阵相乘(标准解法)
设A是pxq的矩阵,B是qxr的矩阵,数乘次数pxqxr,算法时间复杂度为O(n3)
void matrixMultiply(int **Ma,int **Mb,int **Mc,int ra,int ca,int rb,int cb){
if(ca ! rb) error("矩阵不可乘");
for(int i=0; i<ra; i++){
for(int j=0;j<cd;j++){
int sum = 0;
for(int k=0;k<ca;k++){
sum += Ma[i][k] * Mb[k][j];
}
Mc[i][j] = sum;
}
}
}
矩阵连乘问题
给定n个矩阵:{A1,A2,…,An},其中Ai与Ai+1可乘。
求解这n个矩阵的连乘积。
矩阵乘法满足结合律,因此有多种计算顺序
动态规划法
- 将矩阵连乘积(Ai Ai+1 … Aj)记为A[i:j]
- 计算A[1:n]的最优计算次序:设最优计算次序在Ak和Ak+1之间将矩阵链断开(1<=k<n)
- 则完全加括号方式为:(A1…Ak)(Ak+1…An)
- 总计算量为A[1:k] + A[k+1,n] + A[1:k]和A[k+1]相乘的计算量。
1.分析最优解的结构
A[1:n]的最优计算次序所包含的矩阵子链也是最优的。即A[1:k]和A[k+1:n]的计算次序也是最优的。
最优子结构性质:矩阵连乘计算次序问题的最优解包含其子问题的最优解
2.建立递归关系