长春省妇幼网站做四维专业建站培训
news/
2025/9/22 18:38:32/
文章来源:
长春省妇幼网站做四维,专业建站培训,网站建设要做什么,腾讯企业邮箱下载app题目描述 一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵#xff0c;运算量为nmp。 矩阵乘法满足结合律#xff0c;A*B*C可以表示成(A*B)*C或者是A*(B*C)#xff0c;两者的运算…题目描述 一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵运算量为nmp。 矩阵乘法满足结合律A*B*C可以表示成(A*B)*C或者是A*(B*C)两者的运算量却不同。例如当A2*3 B3*4 C4*5时(A*B)*C64而A*(B*C)90。显然第一种顺序节省运算量。 现在给出N个矩阵并输入N1个数第i个矩阵是a[i-1]*a[i]
输入
第一行n(n100) 第二行n1个数
输出 最优的运算量
样例输入
3
2 3 4 5
样例输出
64
分析
其实该题使用了动态规划来选出最优子结构并且使用了以下等式 先初始化m数组和s数组这里使用了C的函数memset(): void* memset(void* s, int c, size_t n); 参数解释 - s指向要填充的内存区域的指针。 - c要设置的字符值实际上是将其转换为对应的ASCII码或字节值。 - n要填充的字节数。 memset函数将s指向的内存区域的前n个字节用c指定的值进行填充。返回值是原始的s指针。 并且m矩阵里面其实填充的是矩阵的右上角的部分如可以看作下图这样 代码
//矩阵连乘
#includeiostream
#includecstring
using namespace std;
const int size 101;
int p[size];
int m[size][size], s[size][size];
int n;void matrixchain()
{int i, r, j, k;memset(m, 0, sizeof(m));memset(s, 0, sizeof(s));//初始化数组for (r 2; r n; r)//矩阵连乘的规模为r {for (i 1; i n - r 1; i){j i r - 1;m[i][j] m[i 1][j] p[i - 1] * p[i] * p[j];//对m[][]开始赋值s[i][j] i;//s[][]存储各子问题的决策点for (k i 1; k j; k)//寻找最优值{int t m[i][k] m[k 1][j] p[i - 1] * p[k] * p[j];if (t m[i][j]){m[i][j] t;s[i][j] k;}}}}
}int main()
{cin n;int i, j;for (i 0; i n; i)cin p[i];matrixchain();cout m[1][n] endl;return 0;
}参考博文动态规划之——矩阵连乘全网最详细博文看这一篇就够了_矩阵连乘问题-CSDN博客
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910000.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!