代码改变世界

蓝桥杯练习一

2013-03-23 19:29  Lves Li  阅读(142)  评论(0编辑  收藏  举报
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;
	}

}