【贪心法反例】最小代价数组合并

有n个分别排好序的整数数组A0 ,A1 ,… ,An-1 , 其中Ai含有Xi个整数,i = 0,1,…,n-1. 已知这些数组顺序存放在一个圆环上,现在要将这些数组合并成一个排好序的大数组,且每次只能把两个在圆环上处于相邻位置的数组合并。定义合并的代价为两个数组中的元素个数之和。问如何选择这n-1次合并次序以使得合并时总的代价达到最少?有人如下设计贪心法:计算所有相邻两个数组的元素数之和,从中选
摘要由CSDN通过智能技术生成

题目如下:

有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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值