博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
矩阵乘法
阅读量:3948 次
发布时间:2019-05-24

本文共 2943 字,大约阅读时间需要 9 分钟。

问题描述(动态规划)  有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。  两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。输入格式  输入的第一行包含一个整数n,表示矩阵的个数。  第二行包含n+1个数,表示给定的矩阵。输出格式  输出一个整数,表示最少的运算次数。样例输入31 10 5 20样例输出150数据规模和约定  1<=n<=1000, 1<=ai<=10000。
import java.util.Scanner;public class JuZheng {
public void printResult(int[] arrayMatrix) {
int length = arrayMatrix.length; //有length个数,可知有length - 1个矩阵 long[][] dp = new long[length][length]; //dp[0][i]和dp[i][0]均为0,无意义 long sum; for(int len = 2;len < length;len++) {
//依次计算len个矩阵相乘的最小结果,即dp[1][len] for(int i = 1, j = len;j < length;i++, j++) {
//此层循环用于计算dp[i][j]值,即矩阵中对角线的元素值 long min = Long.MAX_VALUE; for(int k = i;k < j;k++) {
//此层循环,用于找到dp[i][j]的最小值 sum = dp[i][k] + dp[k + 1][j] + arrayMatrix[i - 1] * arrayMatrix[k] * arrayMatrix[j]; if(min > sum) min = sum; } dp[i][j] = min; } } //输出最终结果 System.out.println(dp[1][length - 1]); return; } public static void main(String[] args) {
JuZheng test = new JuZheng(); Scanner in = new Scanner(System.in); int n = in.nextInt(); if(n <= 1 || n > 1000) return; int[] arrayMatrix = new int[n + 1]; for(int i = 0;i <= n;i++) arrayMatrix[i] = in.nextInt(); test.printResult(arrayMatrix); }}
样例输入矩阵相乘2 3 2 1 0 -1 1 1 -3 0 3 1 2 3 1样例输出-3 2 -8 2
import java.util.Scanner;public class Juzhen {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); int m = 0 , s = 0 , n = 0 ; if(scanner.hasNext()){
//输入m,s,n m = scanner.nextInt() ; s = scanner.nextInt() ; n = scanner.nextInt() ; } //定义两个矩阵,行列数分别为m,s与s,n int arr1[][] = new int[m][s] ; int arr2[][] = new int[s][n] ; for(int i = 0 ; i < m ; i ++){
//输入第一个矩阵 for(int j = 0 ; j < s ; j++){
if(scanner.hasNext()){
arr1[i][j] = scanner.nextInt() ; } } } for(int i = 0 ; i < s ; i++){
//输入第二个矩阵 for(int j = 0 ; j < n ; j++){
if(scanner.hasNext()){
arr2[i][j] = scanner.nextInt() ; } } } int arr[][] = new int[m][n] ; //定义一个相乘后的矩阵,矩阵的行数与列数为m,n for(int i = 0 ; i < m ; i++){
//进行矩阵相乘 for(int j = 0 ; j < n ; j++){
for(int x = 0 ; x < s ; x ++){
//arr[i][j] = arr1[i][1] * arr2[1][j] + ... + arr1[i][s-1] * arr2[s-1][j] arr[i][j] += arr1[i][x] * arr2[x][j] ; } System.out.print(arr[i][j] + " "); } System.out.println(); } }}

转载地址:http://cgrwi.baihongyu.com/

你可能感兴趣的文章
Android绘图机制及处理技巧
查看>>
Bitmap的加载和Cache
查看>>
ListView的使用
查看>>
Android动画机制总结
查看>>
NDK开发总结
查看>>
设计模式之创建型模式
查看>>
设计模式之结构型模式
查看>>
设计模式之行为模式
查看>>
Java内存区域和内存溢出异常
查看>>
Java内存分配及垃圾回收
查看>>
Java并发编程学习——对象的共享
查看>>
Java并发编程学习——对象的组合
查看>>
Java并发编程学习——基础构建模块
查看>>
看懂UML类图和时序图
查看>>
UML 基础: 类图(转自IBM开发者社区)
查看>>
工作感悟(2017/3/26)
查看>>
Spring Data Elasticsearch 配置 LocalDate、LocalDateTime 反序列化
查看>>
Yew 初尝试
查看>>
Rust SSH 操作 执行远程命令 上传下载文件
查看>>
浅谈GCD
查看>>