• 蓝桥杯练习一


    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;
    	}
    
    }
    


     

  • 相关阅读:
    PKU 3984 迷宫问题
    九度 1341 艾薇儿的演唱会
    九度 1335
    SDUT 1198 鞍点计算
    POJ 1363 Rails
    SDUT 1570 C旅行
    HDU 1042 N!
    SDUT 1568 俄罗斯方块
    HDU 1257 最少拦截系统
    POJ 3750 小孩报数问题
  • 原文地址:https://www.cnblogs.com/lixingle/p/3312995.html
Copyright © 2020-2023  润新知