链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1564

Description

Input

Output

只有一个数字,即你所能得到的整棵树的访问代价与额外修改代价之和的最小值。

Sample Input

4 10
1 2 3 4
1 2 3 4
1 2 3 4

Sample Output

29
题解:我们还是老规矩设一个区间f[i][j][w]为区间i~j且树上的每个节点都大于等于w(因为子节点权值一定大于根节点,所以其实就是根节点要大于等于w),来形成一棵树的最小访问代价与额外代价之和。
然后枚举一个k把区间分为左边和右边,k为这棵树的根节点,但是为了左儿子数据值小于根节点,k左边的数据值一定小于k,右边一定大于k,我们事先要把数据值从小到大排序,来保证枚举的区间符合条件。枚举k后我们就要判断一下,如果k节点的权值要大于w,那么我们就不用修改,只要把左边子树值加上右边子树的值再加上本身的访问代价即可,(可能会有点奇怪,我们怎么确保左边和右边的权值一定大于我们枚举的这个根节点呢?哈,这就是w的作用啦,左边的值为f[i][k-1][w],说明左边的所有节点都需大于等于w,如果不存在的话,就会是最大值,所以不会被计算进来),如果要修改再额外加上最初输入的k就可以了。还有一个比较重要的地方,我们需要枚举w,可是原题中的w过大,导致空间超限了,这里就需要进行一个离散化,为什么可以这么做呢?我们可以发现他保证了每个权值都不相同且我们判断时只需要利用他的大小关系,与他本身是无关的,所以可以在一开始的时候就排一下序,然后把权值都变小,就搞定了。
具体的细节还是在程序中写吧。
程序:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int n,j,k1,s[],f[][][];
struct h
{
int x,y,z;
}a[];
bool cmp1(const h&a,const h&b)
{
return (a.y<b.y);
}
bool cmp2(const h&a,const h&b)
{
return (a.x<b.x);
}
int main()
{
scanf("%d %d",&n,&k1);
for (int i=;i<=n;i++) cin>>a[i].x;
for (int i=;i<=n;i++) cin>>a[i].y;
for (int i=;i<=n;i++) cin>>a[i].z;
sort(a+,a++n,cmp1);//按照权值排序
for (int i=;i<=n;i++) a[i].y=i;//进行离散化
sort(a+,a++n,cmp2);//为了符合条件再按照数据值排序
for (int i=;i<=n;i++)
s[i]=s[i-]+a[i].z;//用前缀和把访问频率记录下来,方便计算 for (int i=;i<=n+;i++)
for (int j=;j<=n+;j++)
for (int w=;w<=n+;w++)
f[i][j][w]=;//初始化 for (int i=;i<=n+;i++)
for (int w=;w<=n;w++)
f[i][i-][w]=;//当我们在一个区间中枚举边界i或j为根节点时,我们就会访问到某个f[i][i-1][w],
但其实他是没有左子树或右子树的,所以我们就把它记为0,反正加上去了也没有任何影响。 for (int i=;i<=n;i++)
for (int w=;w<=n;w++)
if (a[i].y>=w) f[i][i][w]=a[i].z;//把本身当做一棵树且这棵树的权值大于等于w时,不必修改。
else f[i][i][w]=a[i].z+k1;//否则就要加上修改的代价 for (int w=n;w>=;w--)
for (int len=;len<=n;len++)
for (int i=;i<=n-len+;i++)//枚举
{
j=i+len-;
for (int k=i;k<=j;k++)
{
if (a[k].y>=w)
f[i][j][w]=min(f[i][j][w],f[i][k-][a[k].y]+f[k+][j][a[k].y]+s[j]-s[i-]);//不需修改时
f[i][j][w]=min(f[i][j][w],f[i][k-][w]+f[k+][j][w]+s[j]-s[i-]+k1); //修改时
}
}
printf("%d",f[][n][]);//因为离散化后节点中权值最小的是1,所以根节点的权值一定是1.
return ;
}

BZOJ 1564: [NOI2009]二叉查找树的更多相关文章

  1. BZOJ 1564: [NOI2009]二叉查找树( dp )

    树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值). 枚举m为根(p表示访问频率): 修改m的权值 ...

  2. bzoj 1564 [NOI2009]二叉查找树 区间DP

    [NOI2009]二叉查找树 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 906  Solved: 630[Submit][Status][Discu ...

  3. bzoj 1564 [NOI2009]二叉查找树(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1564 [题意] 给定一个Treap,总代价为深度*距离之和.可以每次以K的代价修改权值 ...

  4. BZOJ 1564 :[NOI2009]二叉查找树(树型DP)

    二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...

  5. 1564: [NOI2009]二叉查找树 - BZOJ

    Description Input Output只有一个数字,即你所能得到的整棵树的访问代价与额外修改代价之和的最小值.Sample Input4 101 2 3 41 2 3 41 2 3 4Sam ...

  6. [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp

    1564: [NOI2009]二叉查找树 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 879  Solved: 612[Submit][Status] ...

  7. bzoj 1565 [NOI2009]植物大战僵尸 解题报告

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2161  Solved: 1000[Submit][Stat ...

  8. P1864 [NOI2009]二叉查找树

    链接P1864 [NOI2009]二叉查找树 这题还是蛮难的--是我菜. 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质: 首先不管怎么转,中序遍历是确定的,所 ...

  9. NOI2009 二叉查找树 【区间dp】

    [NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...

随机推荐

  1. 用VC进行COM编程所必须掌握的理论知识

    一.为什么要用COM 软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的.结构化编程 ...

  2. angular中ng-model,返回数据,拆分数据,展示,名称相同,重新赋值会有冲突

    本问题出在angular,1.X版本,我用的是1.5的版本: 问题原因: <input type="number" ng-mode="a" /> & ...

  3. hdu5834

    题目让求得是从任意一点出发可以不回来得到的最大的价值 这应该不算特别水的树形dp了,它不止要从上往下dfs,后来海要重新dfs,根据父亲节点更新儿子节点,算是正常的树形dp中比较简单的吧. 思路: 先 ...

  4. 分支合并git checkout adview git merge adview3

    分支合并 git checkout adview git merge adview3

  5. java 常见dos命令

    盘符: 进入指定的盘符下. dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd : 进入指定目录 ...

  6. 【NoSql】MongoDb

    [NoSql]MongoDb 一. 文档 1. 官网 2. C# Driver 3. C# 开发文档 二. 命令 1. --config "C:\mongodb\mongod.cfg&quo ...

  7. 【Python全栈笔记】08 [模块二] 20 Oct 递归 -*** 待补充

    递归 引入 递归的表现形式 下面是四个函数,互相调用返回结果 # 引入 递归的表现形式 def f1(): ' def f2(): r = f1() return r def f3(): r = f2 ...

  8. xcode如何将系统语言改为中文,可修改拍照界面retake和use按钮

    配置项目本地化支持简体中文和英文 工程-PROJECT-info->Localizations,点"+",选择(Chinese(Simplified))添加简体中文,英文Xc ...

  9. Oracle学习线路

    出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验)    作为oracle的基本功,需要大家对sql和 ...

  10. 第十周PSP

    第十周PSP   工作周期:11.17-11.24  本周PSP: C类型 C内容 S开始时间 ST结束时间 I中断时间 T净时间(分) 文档 写随笔(PSP) 16:20min 16:50min 0 ...