您的位置:首页 > 其它

矩阵连乘

2018-01-29 18:32 197 查看
矩阵连乘ppt:https://wenku.baidu.com/view/d56ad40691c69ec3d5bbfd0a79563c1ec5dad78b.html

递推公式:m[i][j] = min( m[i][k] + m[k+1][j] + pi*p(k+1)*p(j+1)  )   k为断点位置。i < j

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int AX = 1e3+6;
int p[AX];
int s[AX][AX];
LL m[AX][AX];
int n ;

void printMatrix( int l , int r ){ //递归打印
if( l == r ) printf("A%d",l);
else{
cout << "(";
printMatrix(l , l + s[l][r]);
printMatrix(l + s[l][r] + 1 , r);
cout << ")";
}
}

LL MatrixChain( ){
for( int i = 0 ; i < n ; i++ ){
m[i][i] = 0;
}
for( int r = 2 ; r <= n ; r ++ ){
for( int i = 0 ; i <= n - r ; i++ ){
int j = i + r - 1;
m[i][j] = m[i][i] + m[i+1][j] + p[i]*p[i+1]*p[j+1];
s[i][j] = i;
for( int k = i + 1 ; k < j ; k++ ){
LL tmp = m[i][k] + m[k+1][j] + p[i]*p[k+1]*p[j+1];
if( tmp < m[i][j] ){
m[i][j] = tmp;
s[i][j] = k;
}
}
}
}
return m[0][n-1];
}

int main(){
cin >> n;
for( int i = 0 ; i < n+1 ; i++ ){
cin >> p[i];
}
cout << MatrixChain( ) << endl;
printMatrix(0 , n-1);
puts("\n");
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: