题干:

小X非常喜欢树,然后他生成了一个大森林给自己玩。
玩着玩着,小X陷入了沉思。

  • 一棵树由N个节点组成,编号为i的节点有一个价值Wi。
  • 假设从树根出发前往第i个节点(可能是树根自己),一共需要经过Di个节点(包括起点和终点),那么这个节点对这棵树产生的负担就是Di与Wi的乘积。
  • 对于一棵树而言,这棵树的负担值为所有节点对它产生的负担之和。

小X学习了dfs,如果他知道树的结构,他当然可以很容易地算出树的负担值。可是现在沉思中的小X并不知道树的结构形态,他只知道一棵二叉树的中序遍历以及每个节点的价值,那么这棵二叉树可能的最小负担值是多少呢?

Input

第一行为一个正整数T(T≤20)表示数据组数。
每组数据包括三行。
第一行为一个正整数N(N≤200)。
第二行为N个正整数Wi(Wi≤108),表示编号为i的节点的价值。
第三行为N个正整数Pi(Pi≤N),为一个1~N的排列,表示二叉树的中序遍历结果。

Output

对于每组数据,输出一行一个正整数,表示这棵树可能的最小负担值。

Sample Input

2
4
1 2 3 4
1 2 3 4
7
1 1 1 1 1 1 1
4 2 3 5 7 1 6

Sample Output

18
17

Hint

对于第一个样例,树根为3,3的左儿子是2,3的右儿子是4,2的左儿子是1,这样构成的树可以达到最小负担。
对于第二个样例,对应的满二叉树可以达到最小负担。

题目大意:

给出一颗二叉树的中序遍历以及每一个节点的价值,求一棵最小负担值的树。那一句:“可能是树根自己”,的意思是,根节点的负担就是自身的价值。

解题报告:

首先我们知道任给一个中序遍历序列,可以组成的树有多种,而如何把这棵树划分开呢?就是看根节点是哪一棵。从而把序列分成左右两棵子树的合并,依次分解的最优解问题,考虑区间dp。

其次就是考虑两棵子树如何合并的问题,其实也很简单,无非就是让这两棵子树的权值多加一遍,顺便加一遍新的根节点的权值,换句话说,也就是对应中序遍历序列的区间和,这一点我们可以用前缀和O1预处理出来,然后转移就ok了。

AC代码:

#include<cstdio>
#include <assert.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e2 + 6;
const ll INF = 0x3f3f;
ll w[MAX],p[MAX],val[MAX],sum[MAX];
ll dp[MAX][MAX];
int main()
{int t,n;cin>>t;while(t--) {scanf("%d",&n);memset(sum,0,sizeof sum);memset(dp,INF,sizeof dp);for(int i = 1; i<=n; i++) scanf("%lld",w+i);for(int i = 1; i<=n; i++) scanf("%lld",p+i);for(int i = 1; i<=n; i++) val[i] = w[p[i]],sum[i] = sum[i-1] + val[i],dp[i][i]=val[i];for(int len = 2; len <= n; len++) {for(int l = 1; l+len-1 <= n; l++) {int r = l + len - 1;dp[l][r]=min(dp[l+1][r],dp[l][r-1])+sum[r]-sum[l-1];for(int k = l+1; k<r; k++) {dp[l][r] = min(dp[l][r],dp[l][k-1] + dp[k+1][r] + sum[r] - sum[l-1]);}}}printf("%lld\n",dp[1][n]);} return 0 ;} 

【CSU - 1980 】不堪重负的树(树上区间dp)相关推荐

  1. CSUOJ-1980 不堪重负的数(区间dp)

    1980: 不堪重负的树 Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 57  ...

  2. jzoj6287-扭动的树【区间dp】

    正题 题目大意 一颗二叉查找树,以keyikey_ikeyi​为建值,以pip_ipi​为价值.然后一个节点的sumsumsum定义为这棵子树的价值之和. 要求相邻两个节点不互质的情况下所有节点的最大 ...

  3. CSP认证201612-4 压缩编码[C++题解]:区间dp、huffman树、石子合并

    题目分析 来源:acwing 分析: 本题难在想到是区间dp.想到区间dp之后,这就是石子合并的代码直接默写. 那么是如何建模的呢?我们把huffman编码(这里要求按照字典序大小编码,和huffma ...

  4. 暑假集训总结——区间DP,堆的概念及应用,STL(vector、set、pair、map、priority_queue),hash表,树状数组,图论

    序言: 经过长达十几天的集训,确实学了不少知识点.我想如果再不总结的话,6天之后又要忘完了. 所以发一篇具有总结回忆性的博客,供大家回忆. 目录会本人自己排列的时间的先后顺序来排列,可直接食用. 目录 ...

  5. 线段树 ---- 线段树上区间二分 或者单点二分 codeforces C. Greedy Shopping

    题目大意 题目大意: 给你一个非增的区间现在你有两次操作 1 x y : 把[a1,...ax][a_1,...a_x][a1​,...ax​]里面的数对yyy取maxmaxmax 2 x y : 你 ...

  6. 计蒜客 2020 蓝桥杯省赛 B 组模拟赛(五)E区间dp H 裴蜀 J dp A-J 权值线段树

    题目链接 因为要去笔试.所以只打了两个小时,有点求快,很多细节没写好就匆匆交,而且没有检查,打的有点菜 C-煎牛排 做法: 所有的面的个数sum=2*n   然后sum/(2*k)即可. ans=ma ...

  7. 0x53. 动态规划 - 区间DP(习题详解 × 8)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...

  8. Vijos 1100 (区间DP)

    题目链接: https://vijos.org/p/1100 题目大意:NOIP著名的加分二叉树.给出一棵树的中序遍历,加分规则左子树*右子树+根.空子树分数为1.问最大加分的树结构,输出树结构的先序 ...

  9. CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)

    解析 很妙的一道题 看这两个南辕北辙的标签就知道这题不简单 看见dp思路还是得打开 一开始其实想到按边权排序了 但卡在了重构树上 遇到dp一定要敢想 勇于和图论等结合 考虑正解 按照边权升序排序 依次 ...

最新文章

  1. TI IPNC Web网页之网页修改教程
  2. java 冒泡排序和快速排序 实现
  3. java学习曲线建议
  4. kafka2.5.0创建主题topic命令
  5. springboot(2.2.4)全局异常处理(RestControllerAdvice,ExceptionHandler)
  6. QT的QPair类的使用
  7. java对mysql数据库进行单表筛选备份、还原操作
  8. 密码学专题 OpenSSL专题
  9. Linux采用服务器网址,Linux实现https方式访问站点
  10. POJ 1741 Tree(树的点分治)
  11. ultraedit查找每行第二个单词_算法4th3:查找
  12. keil转换c为汇编语言,如何用Keil生成bin、汇编、C与汇编混合文件?
  13. 01. Couchbase简介-CouchBase从0到50
  14. python表格绘制斜线表头_【Excel系列05】表格中如何制作斜线表头
  15. P1359 租用游艇【Floyd】
  16. 【总结】程序员运营公众号一年总结
  17. 后台写入前台的日期错误,变成一串数字解决方案
  18. 实时监控一个区块链某地址的实现方案
  19. 小程序 配置域名 业务域名_使域名成为您的业务
  20. 华硕笔记本 安装系统

热门文章

  1. VB6:通过ADO访问Oracle存储过程返回的结果集
  2. [Leedcode][JAVA][第892题][图形题]
  3. 51nod 1101 换零钱 简单dp
  4. boot分布式计算 spring_腾讯T4大佬剖析SpringBoot2 :从搭建小系统到架构分布式大系统...
  5. mysql binlog sql统计_mysql的binlog详解
  6. web 三联发票针式打印_打印机共享操作,其实没想象的那么难
  7. gui显示文本动态框
  8. c语言判断整数_C语言技能|(草稿,不断完善中...)
  9. html5表单密码验证及提示,HTML5表单及其验证(示例代码)
  10. wordl流程图怎么写字_DLG的制作流程图