我使用动态编程吗? c中的矩阵链乘法

时间:2013-05-29 11:09:01

标签: algorithm dynamic-programming

Halo我只是编写代码来执行矩阵链乘法,这可以通过动态编程来解决 http://en.wikipedia.org/wiki/Matrix_chain_multiplication#A_Dynamic_Programming_Algorithm

这是我写的代码,我认为它比维基百科提供的代码简单。所以我怀疑我是否在做动态编程?

我无法弄清楚程序的时间复杂性。有人能帮我弄清楚这个程序的时间复杂性吗?

这是我的猜测.. for循环每次调用都会运行n次?如果不使用mem ..
对于每个循环,它将扩展为两个

如果使用mem,则可以防止重新计算... 啊,我无法理解,希望有人可以帮助我: - )

#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);
}

1 个答案:

答案 0 :(得分:1)

您使用的技术称为memoization。大多数情况下,您可以使用很少(或没有)开销的记忆来解决DP问题。

实现的复杂性与原始DP解决方案类似:O(n ^ 3)(注意:mem数组的每个单元应至少计算一次,每个单元需要O(n)时间计算单元的进一步计算,不涉及任何循环,因为它将是一个简单的查找。)

另见http://en.wikipedia.org/wiki/Memoization