矩陣連乘問(wèn)題

#include<iostream>
using namespace std;
int input_matrix_num;
int p[100];
int m_Matrix(int i, int j);
void print_optimal(int i, int j);
int m[100][100];
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int s[100][100];
int main() {
    cout << "輸入矩陣的個(gè)數(shù):";
    cin >> input_matrix_num;
    cout << "請(qǐng)輸入" << input_matrix_num + 1 << "個(gè)正整數(shù),分別是各個(gè)矩陣的行列數(shù)" << endl;
 
    for (int i = 0;i < input_matrix_num + 1;i++) {
        cin >> p[i];
    }
 
    cout << "原始數(shù)據(jù)為以下矩陣:" << endl;
    for (int i = 0;i < input_matrix_num;i++) {
        cout << "\t" << p[i] << " * " << p[i + 1] << endl;
    }
 
    cout << "m矩陣" << endl;
    for (int i = 1;i <= input_matrix_num;i++) {
        for (int j = 1;j <= input_matrix_num;j++) {
            m[i][j] = m_Matrix(i, j);
        }
    }
 
    for (int i = 1;i <= input_matrix_num;i++) {
        for (int j = 1;j <= input_matrix_num;j++) {
            cout << m[i][j] << "\t";
        }
        cout << endl;
    }
 
    cout << endl;
    cout << "s矩陣" << endl;
    for (int i = 1;i <= input_matrix_num;i++) {
        for (int j = 1;j <= input_matrix_num;j++) {
            cout << s[i][j] << "\t";
        }
        cout << endl;
    }
 
    cout << endl;
    cout << "最優(yōu)的運(yùn)算方式的乘法次數(shù)為:" << m_Matrix(1, 6) << endl;
 
    cout << "加括號(hào)的方式為:" << endl;
 
    print_optimal(1, input_matrix_num);
    cout << endl << endl;
 
}
 
int m_Matrix(int i, int j) {
    int small;
    int sum[100];
    if (j - i == 1) {
        s[i][j] = i;
    }
    while (j - i == 1) {
        return p[i - 1] * p[i] * p[j];
        break;
    }
    while (i >= j) {
        return 0;
        break;
    }
    //把所有的段點(diǎn)k存到一個(gè)數(shù)組,再利用數(shù)組進(jìn)行比較,篩選出最小的那個(gè)          
    for (int k = i;k <= j - 1;k++) {
        sum[k] = m_Matrix(i, k) + m_Matrix(k + 1, j) + p[i - 1] * p[k] * p[j];
    }
 
    int a = i;
    int b = i + 1;
 
    //篩選出運(yùn)算次數(shù)最少的那個(gè)
    while (b <= j - 1) {
        if (sum[a] <= sum[b]) {
            small = sum[a];
            b++;
            s[i][j] = a;
        }
        else {
            small = sum[b];
            a = b;
            b++;
            s[i][j] = a;
        }
    }
 
    return small;
}
 
 
void print_optimal(int i, int j) {
    if (i == j) {
        cout << " A[" << p[i - 1] << "," << p[i] << "]";
    }
    else {
        cout << " ( ";
        print_optimal(i, s[i][j]);
        print_optimal(s[i][j] + 1, j);
        cout << " ) ";
    }
}

運(yùn)行結(jié)果示例


image.png
image.png

理解:

image.png

image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容