树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值).

枚举m为根(p表示访问频率):

修改m的权值 : dp(l, r, v) = min( dp(l, m-1, v) + dp(m+1, r, v) + p(l~r) + K )

不修改(m原先权值≥v) : dp(l, r, v) = min( dp(l, m-1, Value(m)) + dp(m+1, r, Value(m)) + p(l~r) )

时间复杂度O( N log N + N^4 )

-------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 79;
const ll inf = 1LL << 60;
 
int N, C, H[maxn];
ll dp[maxn][maxn][maxn];
 
template<class T>
inline void Min(T &x, T t) {
if(t < x) x = t;
}
 
struct Node {
int d, v, p;
bool operator < (const Node &o) const {
return d < o.d;
}
} o[maxn];
 
ll Dp(int l, int r, int v) {
if(l > r) return 0;
ll &t = dp[l][r][v];
if(~t) return t;
int d = o[r].p - o[l - 1].p;
if(l == r)
return t = d + (o[l].v >= v ? 0 : C);
t = inf;
for(int i = l; i <= r; i++) {
Min(t, Dp(l, i - 1, v) + Dp(i + 1, r, v) + C + d);
if(o[i].v >= v)
Min(t, Dp(l, i - 1, o[i].v) + Dp(i + 1, r, o[i].v) + d);
}
return t;
}
 
int main() {
scanf("%d%d", &N, &C);
for(int i = 1; i <= N; i++) scanf("%d", &o[i].d);
for(int i = 1; i <= N; i++) scanf("%d", &o[i].v);
for(int i = 1; i <= N; i++) scanf("%d", &o[i].p);
sort(o + 1, o + N + 1);
o[0].p = 0;
for(int i = 1; i <= N; i++) {
o[i].p += o[i - 1].p;
H[i - 1] = o[i].v;
}
sort(H, H + N);
int hn = unique(H, H + N) - H;
for(int i = 1; i <= N; i++)
o[i].v = lower_bound(H, H + hn, o[i].v) - H;
memset(dp, -1, sizeof dp);
ll ans = inf;
for(int i = 0; i < hn; i++)
Min(ans, Dp(1, N, i));
cout << ans << "\n";
return 0;
}

-------------------------------------------------------------------------------

1564: [NOI2009]二叉查找树

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 625  Solved: 453
[Submit][Status][Discuss]

Description

Input

Output

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

Sample Input

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

Sample Output

29

HINT

输入的原图是左图,它的访问代价是1×1+2×2+3×3+4×4=30。最佳的修改方案是把输入中的第3个结点的权值改成0,得到右图,访问代价是1×2+2×3+3×1+4×2=19,加上额外修改代价10,一共是29。

Source

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

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

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

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

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

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

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

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

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1564 Description Input Output 只有一个数字,即你所能得到的整棵树的访 ...

  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. windows 7 旗舰版 切换 中英文 界面

    http://jingyan.baidu.com/article/f7ff0bfc4963612e26bb131e.html 如果遇到:想下载英语语言包,但是出现代码80070643,windowsu ...

  2. hibernate报错:org.hibernate.MappingException: No Dialect mapping for JDBC type: -1

    解决方法:自定义一个Hibernate Dialect. package com.yourcompany.util ; import java.sql.Types; import org.hibern ...

  3. JavaScript的对象——灵活与危险

    转:http://www.cnblogs.com/tolg/p/4873000.html 没有哪种数据结构比JavaScript的对象更简单灵活了.作为一个弱动态类型语言,JavaScript对对象的 ...

  4. centos 7 epel地址

    wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

  5. Android 从AndroidManifest获取meta-data

    语法如下: <meta-data android:name="string" android:resource="resource specification&qu ...

  6. Error:(108) No resource identifier found for attribute 'style' in package 'android'

    Error:(108) No resource identifier found for attribute 'style' in package 'android' 解决方案: 这是错误的写法: a ...

  7. Apache无法启动解决方案

    Apache无法启动错误原因: 原因一:80端口占用例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开 ...

  8. chapter 1 Number/Adventurous Person

    part1: 1- Which would be easier to remember a munber or a name? Well, I am better at remembering num ...

  9. Centos6.5下安装php

    安装php: yum -y install php 重启httpd服务激活php: /etc/init.d/httpd restart 测试php是否安装完成 vim /var/www/html/in ...

  10. YII学习,实现基于数据库的后台登录,用户体系.

    上次研究Yii框架写到了要完成用户登陆系统.这次接着上次的写. 参考官方权威指南和参考手册,外加各种博客文章.历尽千辛万苦,数遍天上滴星星.完成了后台用户登录.这里用到了YII框架的 CUserIde ...