题目链接:http://acm.swust.edu.cn/problem/code/745255/

Time limit(ms): 1000        Memory limit(kb): 65535
Description
以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和。 
例如:((4+1)+ (2+3))=((5)+(5))=10。除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加,得到:5+5+10= 20,那么数20称为此数列的一个代价,若得到另一种算法:(4+((1+2)+3))=(4+((3)+3))=(4+(6))=10,数列的另一个代价为:3+6+10=19。若给出N个数,可加N-1对括号,求出此数列的最小代价。 
注:结果范围不超出longint.

Input

第一行为数N(1≤N≤200),第二行为N个正整数,整数之间用空格隔开。

Output

输出仅一行,即为最少代价值。
Sample Input
4
4 1 2 3
Sample Output

19
Hint
解题思路:一个dp问题dp[i][j] 表示区间[i,j]的最小代价,于是在dp[i][j]从中间找一个k值分成两部分尝试不同的数字组合,找出[i,j]内最小代价
     于是得到了一个dp方程如下dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
代码如下:

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 #define min(a,b) a<b?a:b
 5 #define inf 0x3f3f3f3f
 6
 7 int sum[201], dp[201][201]; //dp[i][j]表示区间[i,j]的最小代价
 8 int main()
 9 {
10     int n, i, j, k, r, x;
11     cin >> n;
12     memset(dp, inf, sizeof(dp));
13     for (i = 1; i <= n; i++){
14         cin >> x;
15         sum[i] = sum[i - 1] + x;
16         dp[i][i] = 0;
17     }
18     for (r = 0; r < n; r++){
19         for (i = 1; i <= n - r; i++){
20             j = i + r;
21             for (k = i; k < j; k++){
22                 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
23             }
24         }
25     }
26     cout << dp[1][n] << endl;;
27     return 0;
28 }

View Code

用类似的dp方法可以解决[Swust OJ 574]RentBoat     [Swust oj 419]括号配对     [nyoj 37]回文字符串

转载于:https://www.cnblogs.com/zyxStar/p/4585591.html

[Swust OJ 404]--最小代价树(动态规划)相关推荐

  1. 最小代价树(动态规划)

    Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和.  例如:((4+1)+ (2+ ...

  2. SPH算法(求最小代价树)

    一.sph算法简介 1.最小代价树算法 SPH算法也叫做MPH( minimum path heuristic)算法, 用于构造时延约束最算法小代价组播树. 该算法中每 个目的结点通过与当前组播树有最 ...

  3. 动态规划——钢管切割最小代价问题

    一.问题描述: 设有一根长度为L的钢条,在钢条上标有n个位置点(p1,p2,......,pn).现在需要按钢条上标注的位置将钢条切割为n+1段,每次切割的代价为所切的钢条长度,试求在所有的切割方案中 ...

  4. 【动态规划】最小代价问题

    最小代价问题 Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B( ...

  5. 【模板】最小割树(Gomory-Hu Tree)

    传送门 Description 给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不 ...

  6. [BZOJ4883][Lydsy1705月赛]棋盘上的守卫[最小基环树森林]

    题意 有一大小为 \(n*m\) 的棋盘,要在一些位置放置一些守卫,每个守卫只能保护当前行列之一,同时在每个格子放置守卫有一个代价 \(w\) ,问要使得所有格子都能够被保护,需要最少多少的代价. \ ...

  7. 【bzoj4883】[Lydsy2017年5月月赛]棋盘上的守卫 最小环套树森林

    题目描述 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个 ...

  8. SSL 1460——最小代价问题

    Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B(右下角)的路径 ...

  9. 二叉搜索树-创建最小高度树(递归)

    题意: 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树. 这里回忆一下二叉搜索树的概念: 对于树中的所有子树都有,左子树上的值都小于根节点的值,右子树上的值 ...

最新文章

  1. matlab fsolve()函数的使用。
  2. python爬取内容乱码_【提问】PYTHON 爬取下来的中文数据显示乱码
  3. 使用graphite和grafana进行应用程序监控
  4. 「单点登录与权限管理」系列概述
  5. 树的知识点总结-数据结构
  6. axios_的配置对象详细说明---axios工作笔记007
  7. java 缓冲流 刷新_java – 缓冲和刷新Apache Beam流数据
  8. C语言中的static
  9. 牛客网-华为-2020届校园招聘上机考试-软件类机考-1
  10. Java中hashCode()与 equals()
  11. 最小二乘法拟合空间直线的原理及实现
  12. 空气质量等级c语言编程,编程小白如何快速处理空气质量数据
  13. HTML学生个人网站作业设计:动漫网站设计——梦幻西游(15页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  14. activiti踩坑2-camunda-modeler设计器与activiti7不兼容
  15. Spring Spring-data-redis 实现的消息队列
  16. 计算机网络 理论复习概括
  17. 下一代存储技术面临市场窗口期?
  18. 服务器u用固态硬盘,Bluehost SSD固态硬盘服务器性能评测
  19. 今日晚间互联网科技新闻
  20. 牙膏不只可刷牙——32不寻常用途!!

热门文章

  1. Announcing the Updated NGINX and NGINX Plus Plug‑In for New Relic (Version 2)
  2. ES6新增的let与const
  3. 工资高低由什么决定?(面试时如何谈工资?工作中怎样做才能不断涨工资?)...
  4. ES6数组的解构赋值( 中)
  5. 运营商认为虚拟化也难快速降低企业OPEX
  6. springcloud基于ribbon的canary路由方案
  7. 2016弱校联萌十一专场10.2
  8. PostgreSQL中的数据库实例、模式、用户(角色)、表空间
  9. Javascript导航菜单13则
  10. 不使用第三个变量,实现交换两个变量的值