Algorithm_《算法导论》乘法链问题 发表于 2018-05-05 | 分类于 ACM | 乘法链问题算是比较好理解的了,晚上写了半个小时就调出来了,作为动态规划的第二篇 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152// Matrix.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"/**矩阵的乘法链问题:多个矩阵相乘时,怎么加括号,总的乘法次数最小比如3个矩阵相乘,可以先计算前两个的积,再乘以第三个,也可以先计算后两个的积再乘以第一个。两种方法的乘法次数不同。来源:《算法导论》第四版中文版P205分类:动态规划,算法,ACM@Author:XiaJun@Time:May 5th,2018**/int main(){ //6个矩阵,行数和列数 int mat[6][2] = {{30,35},{35,15},{15,5},{5,10},{10,20},{20,25}}; //一个5行5列的矩阵,记录最优子结构的值 int child[6][6]; int i,j,dis,k = 0,min; //初始化该矩阵 for(i = 0;i < 6;i++) { for(j = 0;j < 6;j++) { child[i][j] = 0; } } //两个矩阵相乘的最优子结构的值是已知的 for(i = 0;i < 5;i++) { child[i][i+1] = mat[i][0]*mat[i][1]*mat[i+1][1]; } //计算所有的最优子结构 for(dis = 2;dis < 6;dis++) { for(i = 0;dis+i < 6;i++) {//i:最优子结构的起始处 j = i+dis;//j:最优子结构的结束处 min = mat[i][0]*mat[i][1]*mat[j][1]+mat[i+1][j]; for(k = i;k < j;k++) { int cur = mat[i][0]*mat[k][1]*mat[j][1]+child[i][k]+child[k+1][j]; min = min > cur?cur:min; } child[i][j] = min; } } printf("最少的乘法计算次数是:%d",child[0][5]); return 0;}