利用动态规划解决连乘问题
来源:互联网 发布:lol小漠鞋子淘宝店 编辑:程序博客网 时间:2024/05/17 02:27
动态规划过程是:每次决策依赖于当前状态,又随机引起状态的转移。一个决策序列就是在变化的状态中产生,所以,这种多阶段最优化决策解决问题的过程称为动态规划。
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
算法描述:
将矩阵连乘积简记为A[i:j] ,这里i≤j 设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全加括号方式为
代码实现:<span style="font-size:18px;">#include<iostream>using namespace std;void MatrixChain(int *p,int n,int **m,int **s){ for(int i = 1;i <= n;i++) m[i][i] = 0;//初始化矩阵 // r 表示每次宽度 // i,j表示从从矩阵i到矩阵j // k 表示切割位置 for(int r = 2;r <= n;r++) for(int i = 1;i <= n-r+1li++){ int j = i+r-1; // 从矩阵i到矩阵j连乘,从i的位置切割,前半部分为0 m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j]; s[i][j] = i; for(int k = i+1;k < j;k++){ int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]; if(t<m[i][j]){ m[i][j] = t; s[i][j] = k; } }//for k }//for i}//for jint main(){ int **m=new int*[10];//m分配空间 for(int i=0; i<10; i++) m[i]=new int[10]; int p[6] = {30,35,15,5,10,25};//初始化p int **s=new int*[10];//s分配空间 for(int i=0; i<10; i++) s[i]=new int[10]; MatrixChain(p,6,m,s);//对矩阵连乘函数的调用 //打印连乘的过程 for(int i = 1;i < 6;i++){ for(int j = 0;j <6;j++){ if(j<i){ cout<<" "; }else{ cout<<m[i][j]<<" "; } } cout<<endl; } //打印连乘的次数 for(int i = 1;i < 6;i++){ for(int j = 0;j <6;j++){ if(j<=i){ cout<<" "; }else{ cout<<s[i][j]<<" "; } } cout<<endl; }return 0;}</span>运行结果
算例分析
初始条件**m(用于存放过程),数组p(所要计算的值),**s(用于存放连乘次数)。算法matrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。
学习该算法心得
动态规划法是求解最优化问题的一种方法,动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
0 0
- 利用动态规划解决连乘问题
- C++动态规划解决矩阵连乘问题
- 动态规划解决矩阵连乘
- 动态规划 - 矩阵连乘问题
- 矩阵连乘问题(动态规划)
- 动态规划--矩阵连乘问题
- 动态规划之矩阵连乘问题
- 动态规划之矩阵连乘问题
- 【动态规划】矩阵连乘问题
- 动态规划:矩阵连乘问题
- 动态规划5-矩阵连乘问题
- 动态规划5-矩阵连乘问题
- 动态规划:矩阵连乘问题
- 动态规划之矩阵连乘问题
- 矩阵连乘问题(动态规划)
- 动态规划之矩阵连乘问题
- 动态规划 之 矩阵连乘问题
- 动态规划 矩阵连乘问题
- Myeclipse下web项目改名,tomcat下不变的问题
- SQL快速入门
- [C#] Asp.Net 簡易Email寄送 使用Gmail
- poj2352树状数组
- Java实现简单的顺序队列
- 利用动态规划解决连乘问题
- Linux内核版本代号
- 为msysgit创建桌面快捷方式
- POJ 1062 昂贵的聘礼【dijkstra(固定终点)】
- 屏1604 和 12232ZA
- leetcode -- First Missing Positive -- 简单trick题目
- bzoj2152(树分治)
- 通过CuteFTP用VBScript使用SFTP,实现Win与Linux的文件传输
- 了解Spring 构造注入和自动注入