FZU1061 矩陣連乘 C STL應用

2021-06-21 01:52:40 字數 1549 閱讀 7019

problem 1061 矩陣連乘

給定n個矩陣,考察這n個矩陣的連乘積a1a2...an。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序,這種計算次序可以用加括號的方式來確定。

矩陣連乘積的計算次序與其計算量有密切關係。例如,考察計算3個矩陣連乘積的例子。設這3個矩陣的維數分別為10*100,100*5,和5*50。若按(a1a2)a3計算,3個矩陣連乘積需要的數乘次數為10*100*5+10*5*50 = 7500。若按a1(a2a3)計算,則總共需要100*5*50+10*100*50 = 75000次數乘。

現在你的任務是對於乙個確定的矩陣連乘方案,計算其需要的數乘次數。

輸入資料由多組資料組成。每組資料格式如下:

第一行是乙個整數n (1≤n≤26),表示矩陣的個數。

接下來n行,每行有乙個大寫字母,表示矩陣的名字,後面有兩個整數a,b,分別表示該矩陣的行數和列數,其中1對於每組資料,輸出僅一行包含乙個整數,即將該矩陣連乘方案需要的數乘次數。如果運算過程中出現不滿足矩陣乘法法則的情況(即左矩陣列數與右矩陣的行數不同),則輸出「error」。

3a 10 100b 100 5c 5 50a(bc)

75000

當作寫設計一類的程式吧。

const  int  max_n = 108 ;

struct mat

mat(int r , int c , char lg):row(r),col(c),logo(lg){}

friend bool operator == (const mat &a , const mat &b)

};mat mat[40] ;

const mat leftkuohao = mat(-100000 , -100000 , '(') ; /*標記(括號*/

/*形如abcd ,也就是()裡面的乘法,返回和,非法返回-1 ,並儲存最後結果矩陣rest */

int gao(vector&list , mat &rest)

rest = mat(list[0].row , list[list.size()-1].col , '*') ;

return ans ;

}vectorgetlist(stack&st)

else

}std::reverse(ans.begin() , ans.end()) ;

return ans ;

}int ans(string s)

else

st.push(mat[s[i] - 'a']) ;

}now = getlist(st) ;

ans += gao(now , rest) ;

return ans ;

}int main()

cin>>s ;

int ans = ans(s) ;

if(ans == -1)

puts("error") ;

else

printf("%d\n" , ans) ;

}return 0 ;

}

FZU 1061 矩陣連乘

description 給定n個矩陣,考察這n個矩陣的連乘積a1a2.an。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序,這種計算次序可以用加括號的方式來確定。矩陣連乘積的計算次序與其計算量有密切關係。例如,考察計算3個矩陣連乘積的例子。設這3個矩陣的維數分別為10 100,1...

矩陣連乘問題(c )

矩陣連乘問題 問題描述 給定n個矩陣 a1,a2,an,其中ai與ai 1是可乘的,i 1,2 n 1。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。輸入資料為矩陣個數和每個矩陣規模,輸出結果為計算矩陣連乘積的計算次序和最少數乘次數。問題分析 1.分析最優解的結構 設計...

矩陣連乘c 最優值

include include define n 20 void matrixchain int p n int n,int m n n int s n n 矩陣個數從兩個開始一次遞增 for r 2 r n r int main void 儲存矩陣的行和列陣列 int m n n 儲存矩陣與矩陣相...