首页 > 学院 > 开发设计 > 正文

蓝桥杯 算法提高 合并石子

2019-11-10 17:59:35
字体:
来源:转载
供稿:网友

算法提高 合并石子  时间限制:2.0s   内存限制:256.0MB    问题描述  在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。输入格式  输入第一行包含一个整数n,表示石子的堆数。  接下来一行,包含n个整数,按顺序给出每堆石子的大小 。输出格式  输出一个整数,表示合并的最小花费。样例输入51 2 3 4 5样例输出33数据规模和约定  1<=n<=1000, 每堆石子至少1颗,最多10000颗。可以看看我原来详解的区间DP:http://blog.csdn.net/QQ_25605637/article/details/50456239

90分超时

import java.util.Scanner;public class Main {		public static void main(String[] args) {		Scanner in = new Scanner(System.in);		int n = in.nextInt();		int[] a = new int[1010];		int[][] temp = new int[1010][1010];		int[][] dp = new int[1010][1010];		for(int i=1; i<=n; i++) {			a[i] = in.nextInt();			temp[i][i] = a[i];		}		for(int i=1; i<n; i++) {			for(int j=i+1; j<=n; j++) {				temp[i][j] = temp[i][j-1] + a[j];			}		}		for(int r=2; r<=n; r++) {			for(int i=1; i<=n-r+1; i++) {				int j=i+r-1;				dp[i][j] = Integer.MAX_VALUE;				for(int k=i; k<j; k++) {					if(dp[i][j] > dp[i][k] + dp[k+1][j])						dp[i][j] = dp[i][k] + dp[k+1][j];				}				dp[i][j] += temp[i][j];			}		}		System.out.PRintln(dp[1][n]); 	}}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表