經(jīng)典例題-MatrixChain

MatrixChain

We have a sequense continues matrix and A of matrix's col equals B of matrix's row.
When the A of matrix multiply B附较,the operate times is row[A] * col[A] * col[B].
So, please to calculate minmal operate times, if you change matrix multiply order.

Sample

#include <iostream>
using namespace std;
#include <time.h>
#include <stdlib.h>
#include <string.h>
int const MAX_DATA = 60, MIN_DATA = 5;
int const MAX_N = 10, MIN_N = 5;
int n;
int* data;
int** m;
int** s;
// init
void getData() {
    srand((unsigned)time(NULL));
    n = MIN_N + rand() % (MAX_N - MIN_N);
    //n = 5;
    data = new int[n+1]();
    //data[0]=30; data[1]=35;data[2]=15;data[3]=5;data[4]=10;data[5]=20;
    m = new int*[n+1];
    s = new int*[n+1];
    cout << "data: n = " << n << endl << "<";
    for (int i = 0; i < n+1; i++) {
        data[i] = MIN_DATA + rand() % (MAX_DATA - MIN_DATA);
        cout << data[i] << ", ";
        m[i] = new int[n+1]();
        s[i] = new int[n+1]();
    }
    cout << ">" << endl;
}
// 按照 r 來(lái)打印數(shù)據(jù)
void printR() {
    cout << endl << "  m[i,j] print : " << endl;
    for (int k = 1; k <= n; k++) {
        cout << "r=" << k;
        for (int i = 1; i < n+1; i++) {
            for (int j = 1; j < n+1; j++) {
                if ((j-i+1) == k) {
                    cout << "\tm[" << i << ", " << j << "]=" << m[i][j];
                }
            }
        }
        cout << endl;
    }
    cout << endl << "  s[i,j] print : " << endl;
    for (int k = 2; k <= n; k++) {
        cout << "r=" << k;
        for (int i = 1; i < n+1; i++) {
            for (int j = 1; j < n+1; j++) {
                if ((j-i+1) == k) {
                    cout << "\ts[" << i << ", " << j << "]=" << s[i][j];
                }
            }
        }
        cout << endl;
    }
}

// solve
void matrixChain(int* data,int n) {
    // init arr
    for (int i = 0; i < n+1; i++){ 
        for (int j = 0; j < n+1; j++) {
            s[i][j] = i;
        }
    }
    printR();
    for(int r = 2; r <= n; r++) { // chain of length [0 - n]  子問(wèn)題劃分 
        for(int i = 1; i <= (n-r+1); i++) { //  n-1+1 遍歷其中的元素 
            int j = i + r -1; // j = 1 + 2 - 1 = 2 // 從子問(wèn)題起始點(diǎn) 
            m[i][j] = m[i+1][j] + data[i-1]*data[i]*data[j];  // 計(jì)算當(dāng)前數(shù)據(jù) data[0]data[1]data[2] +m[2,2] = 優(yōu)化值 m[1,2]
            s[i][j] = i; //s[i][j] = i;  標(biāo)記元素 = 坐標(biāo) 記錄分割位置 s[1,2] = 1
            for(int k = i + 1; k <= j - 1; k++) { // 尋找其他劃分 k = 2 < 2 - 1 
                int t = m[i][k] + m[k+1][j] + data[i-1]*data[k]*data[j]; // 前面的 + 后面的 + 相乘數(shù)據(jù)
                if (t < m[i][j]) {
                    m[i][j] = t;
                    s[i][j] = k;
                }
            }
        }
    }
}
// solve
int recurMatrixChain(int* data,int i, int j) {
    if (i == j) { // 遞歸到最小單元 如 data[1][1] = 0; data[1][1]=1
        m[i][j] = 0;
        s[i][j] = i;
        return m[i][j]; 
    }
    m[i][j] = 1 << 30; // 該i到j(luò) 賦予最大值
    s[i][j] = i; // 分割點(diǎn)在i
    for (int k = i; k <= j-1; k++) { // 從i到j(luò)-1開(kāi)始遞歸處理求最小值尼酿,在加上整體數(shù)據(jù)
        int q = recurMatrixChain(data, i, k) + recurMatrixChain(data, k+1, j) + data[i-1]*data[k]*data[j]; //data[0]*data[k]*data[j]
        if (q < m[i][j]) {
            m[i][j] = q;
            s[i][j] = k;
        }
    }
    return m[i][j];
}
// 打印過(guò)程
void printProcess(int start, int end) {
    if (start == end) return;
    printProcess(start, s[start][end]);
    printProcess(s[start][end]+1, end);
    cout << "(A" << start << "*A" <<end << ")";
    if (start != 1 || end !=n) {
        cout << "->";
    }
}
// 打印序列
void printOrder(int start, int end) {
    if (start == end) {
        cout << "A"<< end;
        return;
    }
    cout << "(";
    printOrder(start, s[start][end]);
    cout << " * ";
    printOrder(s[start][end]+1, end);
    cout << ")";
}
void printResult() {    
    cout << endl << "result : " << m[1][n] << endl;
    printOrder(1, n);
    cout << endl;
    printProcess(1, n);
}
int main() {
    getData();
    //matrixChain(data, n);
    recurMatrixChain(data, 1, n);
    printR();
    printResult();
    getchar();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讥珍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澎嚣,老刑警劉巖指厌,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凉逛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阁危,警方通過(guò)查閱死者的電腦和手機(jī)玛痊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狂打,“玉大人擂煞,你說(shuō)我怎么就攤上這事∨肯纾” “怎么了对省?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晾捏。 經(jīng)常有香客問(wèn)我蒿涎,道長(zhǎng),這世上最難降的妖魔是什么粟瞬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任同仆,我火速辦了婚禮,結(jié)果婚禮上裙品,老公的妹妹穿的比我還像新娘俗批。我一直安慰自己,他們只是感情好市怎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布岁忘。 她就那樣靜靜地躺著,像睡著了一般区匠。 火紅的嫁衣襯著肌膚如雪干像。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天驰弄,我揣著相機(jī)與錄音麻汰,去河邊找鬼。 笑死戚篙,一個(gè)胖子當(dāng)著我的面吹牛五鲫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岔擂,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼位喂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浪耘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起塑崖,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤七冲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后规婆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體澜躺,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年抒蚜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苗踪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡削锰,死狀恐怖通铲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情器贩,我是刑警寧澤颅夺,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛹稍,受9級(jí)特大地震影響吧黄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唆姐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一拗慨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奉芦,春花似錦赵抢、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至先巴,卻和暖如春其爵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伸蚯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工摩渺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剂邮。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓摇幻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囚企,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,511評(píng)論 0 23
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,747評(píng)論 0 33
  • 五一節(jié)瑞眼,表哥姑姑和姑父來(lái)我們家玩龙宏。表哥夸自己是玉樹(shù)臨風(fēng)、風(fēng)流倜儻伤疙,還說(shuō)自己的家银酗,像皇宮一樣。 吃完早餐徒像,我們...
    JC賈閱讀 448評(píng)論 3 0
  • 寵物嘛黍特。我喜歡貓貓,兔子锯蛀,還有小狗狗灭衷。其他的就一般般羅。最是喜歡貓啦旁涤。- 從小家里就有開(kāi)始養(yǎng)貓翔曲。印象中有三四只吧。...
    娛情飯桶說(shuō)閱讀 1,002評(píng)論 7 11
  • 下班走出單位的時(shí)候劈愚,天已經(jīng)黑了瞳遍。家里有煮熟了的羊肉,所以我不用急著回去做飯菌羽,慢悠悠地往回走著掠械。 天空融進(jìn)了...
    牛小八閱讀 258評(píng)論 0 0