蓝桥杯练习一

来源:互联网 发布:优化企业内部控制制度 编辑:程序博客网 时间:2024/06/08 13:37
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 stubGetMinArray 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;}}


 

原创粉丝点击