沙子合并
2016-04-17 09:14
246 查看
问题描述:
设有n堆沙子,其编号为A1,A2,A3……An,每堆沙子都有一定的数量,例如:
13 7 8 16 21 4 18
现在要将n堆沙子归并成一堆,归并的过程为每次只能将相邻的两堆沙子堆成一堆,这样经过n-1次归并后成为一堆。
归并的代价是这样定义的:将两堆沙子归并为一堆时,两堆沙子的数量的和称为归并两堆沙子的代价。
问题:但n堆沙子的数量给出之后,找出一种合理的归并方法,使总的归并代价为最小。
输入样例:
13 7 8 16 21 4 18
输出样例:
239
区间dp,枚举切开的位置
dp(i,j)=dp(i,k)+dp(k+1,j)+sum[i,k]+sum[k+1,j];
i<=k<=j-1 ,当i==j时dp(i,j)=0;
预先处理sum,表示i到j的和
int[][]
sum=new int[n+1][n+1];
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
for(int k=i;k<=j;k++)
sum[i][j]+=num[k];
DP部分
public
static int dp(int[] num,int start,int end,int[][] sum)
{
if(start==end)
return 0;
int min=Integer.MAX_VALUE;
for(int k=start;k<=end-1;k++)
{
int temp=dp(num, start, k,sum)+dp(num,k+1,end,sum)+sum[start][k]+sum[k+1][end];
if(temp<min)
min=temp;
}
return min;
}
设有n堆沙子,其编号为A1,A2,A3……An,每堆沙子都有一定的数量,例如:
13 7 8 16 21 4 18
现在要将n堆沙子归并成一堆,归并的过程为每次只能将相邻的两堆沙子堆成一堆,这样经过n-1次归并后成为一堆。
归并的代价是这样定义的:将两堆沙子归并为一堆时,两堆沙子的数量的和称为归并两堆沙子的代价。
问题:但n堆沙子的数量给出之后,找出一种合理的归并方法,使总的归并代价为最小。
输入样例:
13 7 8 16 21 4 18
输出样例:
239
区间dp,枚举切开的位置
dp(i,j)=dp(i,k)+dp(k+1,j)+sum[i,k]+sum[k+1,j];
i<=k<=j-1 ,当i==j时dp(i,j)=0;
预先处理sum,表示i到j的和
int[][]
sum=new int[n+1][n+1];
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
for(int k=i;k<=j;k++)
sum[i][j]+=num[k];
DP部分
public
static int dp(int[] num,int start,int end,int[][] sum)
{
if(start==end)
return 0;
int min=Integer.MAX_VALUE;
for(int k=start;k<=end-1;k++)
{
int temp=dp(num, start, k,sum)+dp(num,k+1,end,sum)+sum[start][k]+sum[k+1][end];
if(temp<min)
min=temp;
}
return min;
}
相关文章推荐
- POJ 2395 Out of Hay
- Makefile学习(1) arm-linux-ld arm-linux-objcopy arm-linux-objdump
- C++11编译器支持列表
- 自己实现的一个Cache 使用最近常使用算法
- 计算机网络中的TCP/UDP协议到底是怎么回事(一)
- 浅谈测试驱动开发(TDD)
- HDU 2102 A计划
- POJ 2488 A Knight's Journey
- POJ 3176 Cow Bowling
- POJ 1664 放苹果
- 从BlueSky.h和BlueSky.cpp到BlueSky.out的那些事儿
- C#单元测试面面观
- 《董福祥宫保府》后记
- SOAPUI笔记1: window安装
- POJ 3259 Wormholes
- Tech Blog
- 基于zookeeper应用——简单统一命名服务实现
- PHP垃圾回收机制
- 程序员必须要掌握的排序算法以及查找方法
- iOS之const,static,extern简介