上代码吧
void matrixChain(){
for(int i=1;i<=n;i++)m[i][i]=0;
for(int r=2;r<=n;r++)//对角线循环
for(int i=1;i<=n-r+1;i++){//行循环
int j = r+i-1;//列的控制
//找m[i][j]的最小值,先初始化一下,令k=i
m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];
//m[i][i]可省,为0
s[i][j]=i;
//k从i+1到j-1循环找m[i][j]的最小值
for(int k = i+1;k<j;k++){
int temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(temp<m[i][j]){
m[i][j]=temp;
//s[][]用来记录在子序列i-j段中,在k位置处
断开能得到最优解
s[i][j]=k;
}
}
}
}
接下来,来分析下流程是怎么走的
假设n大小为6;
for(int i=1;i<=n;i++)m[i][i]=0;
实际等同于 :
r=1
i=1 j=1 m[i][i]
i=2 i=2 …
i=3 j=3
i=4 j=4
i=5 j=5
i=6 j=6 …
for(int r=2;r<=n;r++)//对角线循环
for(int i=1;i<=n-r+1;i++){//行循环
int j = r+i-1;//列的控制
r=2 i<=5
i=1 j=2 m[1][2]
i=2 i=3 m[2][3]
i=3 j=4 …
i=4 j=5 …
i=5 j=6 …
r=3 i<=4
i=1 j=3 m[1][3]
i=2 i=4 m[2][4]
i=3 j=5 …
i=4 j=6 …
r=4 i<=3
i=1 j=4 m[1][4]
i=2 i=5 m[2][5]
i=3 j=6 m[3][6]
r=5 i<=2
i=1 j=5 m[1][5]
i=2 i=6 m[2][6]
r=6 i<=1
i=1 j=6 m[1][6]