zoukankan      html  css  js  c++  java
  • Java 矩阵连乘

    动态规划的矩阵连乘问题
    不知道怎么描述,就是找规律,套公式

    import java.util.Scanner;
    
    public class 矩阵连乘 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner sc=new Scanner(System.in);
    	    int n=sc.nextInt();
    	    int array[]=new int[n];
    	    int arrayA[][]=new int[n][n];
    	    int arrayB[][]=new int[n][n];
    	    for(int i=0;i<n;i++) {
    	    	array[i]=sc.nextInt();
    	    }
           int res=solve(array,arrayA,arrayB);
           System.out.println("最少乘法次数:"+res);
           traceback(arrayB,1,n-1);
           
    	}
    
    	private static void traceback(int[][] arrayB, int i, int j) {
    		if(i==j) {
    			return ;
    		}
    		traceback(arrayB,i,arrayB[i][j]);
    		traceback(arrayB,arrayB[i][j]+1,j);
    		System.out.println("元素 A"+i+","+arrayB[i][j]+"和元素A"+(arrayB[i][j]+1)+","+j);
    		
    	}
    
    	private static int solve(int[] array, int[][] arrayA,int arrayB[][]) {
    		int n=array.length-1;
    		for(int i=1;i<=n;i++) {
    			arrayA[i][i]=0;//对角线设置为0
    		}
    		for(int r=2;r<=n;r++) {//r控制的是行数,用来协调i和j
    			for(int i=1;i<=n-r+1;i++) {
    				int j=r+i-1;//j最小从2开始
    				arrayA[i][j]=arrayA[i+1][j]+array[i-1]*array[i]*array[j];
    				arrayB[i][j]=i;
    				for(int k=i+1;k<j;k++) {
    					int t=arrayA[i][k]+arrayA[k+1][j]+array[i-1]*array[k]*array[j];
    					if(t<arrayA[i][j]) {
    						arrayA[i][j]=t;
    						arrayB[i][j]=k;
    					}
    				}
    				
    			}
    		}
    		return arrayA[1][n];
    	}
        
    }
  • 相关阅读:
    flask强大的三方组件flask-Migrate
    FTP和HTTP
    MD5-JS加密
    使用websocket实现单聊和多聊
    Flask上下文管理
    python中的with用法
    如何判断一个对象是可调用对象
    缓存
    websocket与http
    csrf
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309681.html
Copyright © 2011-2022 走看看