zoukankan      html  css  js  c++  java
  • 蓝桥杯练习一

    package com.lanqiaobei.SanyueTest1;
    
    import java.util.Scanner;
    /*
     * 
     * 动态规划1
    题目描述:依次从左到右给你n个数字,每次取出一个数字(这个数字不能是最两边的数字),
     这个数字和它左右两边的数字(一共三个数字)相乘,累加这个数。直到最后仅剩下两个数字。
     求最后累加的最小值。分析:dp。 dp[i][j] 表示把第 i 个数字到第 j 个数字之间(不包括i,j)的数字去光后得到的最小值。
     设 x[i] 是第 i 个数字的值。dp[i][j] = min(dp[i][k] + dp[k][j] + x[i] * x[k] * x[j]),
     i + 1 <= k <= j - 1所有连续的两个数已经符合要求,即dp[i][i + 1] = 0;
     * 
     * */
    public class GetMinArray {
    
    	int max=34534534;
    	static int[][] min=new int[100][100];
    	static int x[]=new int[100];
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		GetMinArray gA=new GetMinArray();
    		Scanner sc=new Scanner(System.in);
    		
    		System.out.println("请输入你要求的数的个数:");
    		int n=sc.nextInt();
    		//为数组赋值
    		//memset(min,-1,100);
    		for (int l=0;l<n;l++){
    			x[l]=sc.nextInt();
    			
    		}
    		//遍历数组
    		for (int l=0;l<n;l++){
    			for (int k=0;k<100;k++){
    				min[l][k]=-1;
    			}
    			
    		}
    		int result=gA.getMinAToB(0,n-1);
    		System.out.println(result);
    
    	}
    	public int getMinAToB(int a,int b){
    		
    		if (b-a==1){return min[a][b]=1;}
    		if (min[a][b]!=-1) return min[a][b];
    		
    		for (int i=a+1;i<b;i++){	
    			int d1=getMinAToB(a,i);
    			int d2=getMinAToB(i,b);
    			if ((d1+d2+x[i]*x[a]*x[b])<max){
    				max=x[a]*x[b]*x[i]+d1+d2;
    			}	
    		}
    		min[a][b]=max;
    		return  max;
    	}
    
    }
    


     

  • 相关阅读:
    简单介绍数据流动的控制
    数据再寄存器中的暂时保存
    八位三态数据通路控制器的逻辑电路设计讲解
    什么是同步有限状态机???
    verilog逻辑复制
    流水线经典讲解!!!!!
    流水线(pipe-line)简介
    总线(BUS)和总线操作
    多路选择器(multiplexer)简介
    使用telnet发送HTTP请求
  • 原文地址:https://www.cnblogs.com/lixingle/p/3312995.html
Copyright © 2011-2022 走看看