蓝桥杯练习一
2013-03-23 19:29 Lves Li 阅读(152) 评论(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;
}
}
浙公网安备 33010602011771号