Algorithm 我在使用动态规划吗?c语言中的矩阵链乘法
Halo我只是编写代码来执行矩阵链乘法,这可以通过动态规划来解决 这是我写的代码,我认为它比维基百科提供的代码简单。所以我怀疑我是否在做动态规划 我无法计算我的程序的时间复杂度。有人能帮我计算一下这个程序的时间复杂度吗 我猜。。 for循环将为每个调用运行n次?如果未使用mem..Algorithm 我在使用动态规划吗?c语言中的矩阵链乘法,algorithm,dynamic-programming,Algorithm,Dynamic Programming,Halo我只是编写代码来执行矩阵链乘法,这可以通过动态规划来解决 这是我写的代码,我认为它比维基百科提供的代码简单。所以我怀疑我是否在做动态规划 我无法计算我的程序的时间复杂度。有人能帮我计算一下这个程序的时间复杂度吗 我猜。。 for循环将为每个调用运行n次?如果未使用mem.. 对于每个循环,它将扩展为两个 如果使用mem,则会阻止重新计算。。。 啊,我想不出来,希望有人能帮我:-) #包括 #包括 #包括 #包括 使用名称空间std; 国际货币基金组织[10][10]; int行[10]
对于每个循环,它将扩展为两个 如果使用mem,则会阻止重新计算。。。 啊,我想不出来,希望有人能帮我:-)
#包括
#包括
#包括
#包括
使用名称空间std;
国际货币基金组织[10][10];
int行[10];
国际货币基金组织[10];
int m[10];
#定义数字4
内部DP(内部c,内部r){
如果(mem[c][r]!=INT_MAX)返回mem[c][r];
如果(c==r)返回0;
国际最低成本;
对于(int j=c;j a;
m[i]=a;
}
cout您使用的技术称为memorization
。大多数情况下,您可以使用memorization来解决DP问题,而几乎不需要(或根本不需要)开销
您的实现的复杂性与原始DP解决方案类似:O(n^3)(注意:mem
数组的每个单元格至少应计算一次,每个单元格的计算时间为O(n)。单元格的进一步计算不涉及任何循环,因为这将是一个简单的查找。)
另请参见可能的副本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <climits>
using namespace std;
int mem[10][10];
int row[10];
int col[10];
int m[10];
#define NUM 4
int DP(int c, int r){
if(mem[c][r] != INT_MAX) return mem[c][r];
if(c == r) return 0;
int min_cost;
for(int j=c; j<r; j++){
min_cost = DP(c, j) + DP(j+1, r) + m[c-1]*m[j]*m[r];
if(min_cost < mem[c][r])
mem[c][r] = min_cost;
}
return mem[c][r];
}
int main(){
for(int i=0; i< 10;i++){
for(int j=0; j<10;j++){
mem[i][j] = INT_MAX;
}
}
int n = NUM; // MAX 4 matrix
int a,b;
for(int i=0; i< NUM+1; i++){
cin >> a;
m[i] = a;
}
cout << "Lowest Cost for matrix multiplicatoin " << DP(1,NUM);
}