矩阵连乘

直接递归版

#include
#include
using namespace std;
int s[10000][10000];
int p[100];
int RecurMatrixChain(int i,int j);
void PrintOptimalParens(int i,int j);
int main()
{
    int m,n,t,num;
    cin >> m;
    getchar();
    char ch;
    while(m--){
        num = 0;
        while(cin >> t){
            ch = getchar();
            p[num++] = t;
            if(ch == '\n'){
                break;
            }
        }
        int ans = RecurMatrixChain(1,num-1);
        cout << ans << endl;
        PrintOptimalParens(1,num-1);
    }
    return 0;
}
int RecurMatrixChain(int i,int j){
    if(i==j){
        return  0;
    }
    int u=RecurMatrixChain(i,i)+RecurMatrixChain(i+1,j)+p[i-1]*p[i]*p[j] ;
    s[i][j]=i;   // u追踪记录最小值;s[][]记录取得最小值的位置k
    for (int k=i+1; k<j; k++){//穷举的过程,递归计算
        int t=RecurMatrixChain(i,k)+RecurMatrixChain(k+1,j)+p[i-1]*p[k]*p[j];
        if (t<u){
            u=t;
            s[i][j]=k;
        }//记录最优答案
    }
    return u;
}
void PrintOptimalParens(int i,int j){
    if(i == j){
        cout << "A" << i;
    }
    else{
        cout << "(";
        PrintOptimalParens(i,s[i][j]);
        PrintOptimalParens(s[i][j]+1,j);
        cout << ")";
    }
    return;
}

矩阵连乘_第1张图片

你可能感兴趣的:(C++,数组,dp,矩阵连乘)