• 矩阵链乘(递归求解)


    问题描述

      有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。
      两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。

    输入格式

      输入的第一行包含一个整数n,表示矩阵的个数。
      第二行包含n+1个数,表示给定的矩阵。

    输出格式

      输出一个整数,表示最少的运算次数。

    样例输入

    3
    1 10 5 20

    样例输出

    150

    数据规模和约定

    1<=n<=1000, 1<=ai<=10000。

    1.递归求解

    思路:n个矩阵a0*a1*a2*......*an的解为

    代码:

    package com.xuzhiyuan.day4;
    
    import java.util.Scanner;
    
    import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
    
    public class Test4 {
    
        public static void main(String[] args) {
            
            Scanner input=new Scanner(System.in);
            
            int n=input.nextInt();//n个矩阵
            int[] nums=new int[n+1];//存储矩阵
            for(int i=0;i<n+1;i++) {
                
                nums[i]=input.nextInt();
                
            }
            
            //将n个矩阵放在字符串中并且矩阵的每个值用" "隔开
            String matrix="";
            for(int i=0;i<nums.length;i++) {
                
                if(i!=n) {
                    
                    matrix=matrix+nums[i]+" ";
                    
                }else {
                    
                    matrix=matrix+nums[i];
                    
                }
                
            }
            
            System.out.println(minOperation(matrix,0,Integer.MAX_VALUE));
    
        }
    
        /*
         * 递计算矩阵的最少运算次数
         */
        private static int minOperation(String matrix,int calTimes,int mincalTimes) {
            
            String[] matrixs=matrix.split(" ");
            
            int num1,num2,num3;//表示两个矩阵的行数,列数
            if(matrixs.length==3) {
                
                //将用字符串表的矩阵转换成int类型
                num1=Integer.parseInt(matrixs[0]);
                num2=Integer.parseInt(matrixs[1]);
                num3=Integer.parseInt(matrixs[2]);
                
                calTimes=num1*num2*num3+calTimes;
                
                mincalTimes=calTimes<mincalTimes?calTimes:mincalTimes;
                
                return mincalTimes;
                
            }
        
            for(int i=0;i<matrixs.length-2;i++) {
            
                //num1,num2,num3分别为本次选择的两个矩阵的行数,列数,
                num1=Integer.parseInt(matrixs[i]);
                num2=Integer.parseInt(matrixs[i+1]);
                num3=Integer.parseInt(matrixs[i+2]);
                
                
                calTimes=calTimes+num1*num2*num3;
                mincalTimes=minOperation(remainMatrix(matrix,i),calTimes,mincalTimes);
                
            }
            
            
            return mincalTimes;
            
        }
    
        //剩余所有矩阵
        private static String remainMatrix(String matrix,int num) {
            
            return matrix.substring(0,2*num+1)+matrix.substring(2*num+4);
            
        }
        
    }
  • 相关阅读:
    32-数据链路层,PPP协议
    31-NAT
    30-安全技术,ACL
    ensp实验:配置DHCP
    29-应用层,DHCP协议
    ensp实验:配置stp
    28-STP,选举过程、端口状态、计时器、拓扑变化
    27-交换机,STP
    26-交换机,GVRP
    Manually APK Downgrade for split apks
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/7789051.html
Copyright © 2020-2023  润新知