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