石子合并(一)

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
    有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。

输入
有多组测试数据,输入到文件结束。

每组测试数据第一行有一个整数n,表示有n堆石子。

接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
输出
输出总代价的最小值,占单独的一行
样例输入
3
1 2 3
7
13 7 8 16 21 4 18
样例输出
9
239
来源
经典问题
上传者

TC_胡仁东


/*dp数组中存放合并i--j所需要的最少代价,局部最优达到整体最优,刚开始
从一个到两个*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 0x3f3f3f
int dp[210][210];
int a[210];
int sum[210];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
memset(dp,0,sizeof(dp));
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
//i和j固定了起点和终点,k相当于节点,通过变换k来达到i--j最优
{
int temp=MAX;
for(int k=i;k<j;k++)//k!=j,因为同一堆石子不能合并
temp=min(temp,dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
dp[i][j]=temp;
}
}
printf("%d\n",dp[1][n]);
}
return 0;
}


最新文章

  1. 利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
  2. 【转】WPF 单选的Checkbox
  3. mysql,命令导入\导出表结构或数据
  4. live555库中的testRTSPClient实例
  5. 从一个QQ群友那儿偷来的js图形 ^_^
  6. shell中&amp;&amp;和||的使用方法
  7. Java多线程-线程的调度(守护线程)
  8. hibernate--持久对象的生命周期介绍
  9. 【Java】Web 服务编程技巧与窍门: 在 UDDI 注册中心为 Web 服务注册开发 UDDI Java 应用程序
  10. Java 二次MD5 32位小写加密算法与php页面加密结果相同
  11. Foundations of Computer Science
  12. 当final作用于变量、参数、方法和类时该如何处理
  13. 参照企业微信审批业务,在Winform开发框架中工作流模块的实现业务审批
  14. java中抽象类的概念
  15. Python中模块之os的功能介绍
  16. virltualbox 升级之后 苹果虚拟机报The installed support driver doesn&#39;t match the version of the user解决方案
  17. SQLServer 清空某个库所有表
  18. Dubbo+zookeeper面试题补充
  19. InstallShield 读注册表函数 RegDBGetKeyValueEx ()执行失败
  20. Python地理位置信息库geopy的使用(一):基本使用

热门文章

  1. intelliJ idea运行新的test功能时,报错:class not found &quot;.....&quot; empty test suite
  2. 7.gcc的使用
  3. 关于requestAnimationFrame()和cancelAnimationFrame()与定时器之间的比较
  4. HDU 2955 Robberies【01背包】
  5. RunLoop主要处理以下6类事件
  6. Unity 烘焙的2种方式
  7. node——含有异步函数的函数封装
  8. windows下Word使用-快捷键
  9. HDU 5776 sum( 鸽巢定理简单题 )
  10. Ansible学习记录四:单命令测试