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 儲存矩陣與矩陣相...