题目如下:
有n个分别排好序的整数数组A0 ,A1 ,… ,An-1 , 其中Ai含有Xi个整数,i = 0,1,…,n-1. 已知这些数组顺序存放在一个圆环上,现在要将这些数组合并成一个排好序的大数组,且每次只能把两个在圆环上处于相邻位置的数组合并。定义合并的代价为两个数组中的元素个数之和。问如何选择这n-1次合并次序以使得合并时总的代价达到最少?有人如下设计贪心法:计算所有相邻两个数组的元素数之和,从中选择元素之和最小的两个数组进行合并。这种贪心法是否能够对所有的实例得到最优解?举出反例或证明你的结果。
解:告诉你这个方法肯定不对啦。。。所以任务就是找出一个反例来,偷懒的办法就是用笔算,自己大脑构造一个,可惜并不是那么容易构造的。所以,果断把正确算法实现了,产生随机数对拍啊。。。
一种正确的解法是用动态规划,定义dp[i, j]表示从i到j的元素合并的最小代价,闭区间,注意i > j是有可能的,表示i, i + 1... n, 1, ... j这个子数组。
于是状态转移方程为:dp[i, j] = min(dp[i, k] + dp[k + 1, j] + sum(i..j)), for k in i...j
下面是java实现代码:
package edu.pku.course;
import java.util.ArrayList;
public class ArrayTest {
private static int[] arr;
private static int getSum(int i, in