bzoj 1564 [NOI2009]二叉查找树 区间DP
[NOI2009]二叉查找树
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 906 Solved: 630
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3 4
1 2 3 4
1 2 3 4
Sample Output
HINT
输入的原图是左图,它的访问代价是1×1+2×2+3×3+4×4=30。最佳的修改方案是把输入中的第3个结点的权值改成0,得到右图,访问代价是1×2+2×3+3×1+4×2=19,加上额外修改代价10,一共是29。
Source
(1)将根节点i的权值修改为m,有dp[l][r][m] = dp[l][i - 1][m] + dp[i + 1][r][m] + K
(2)根节点i的权值≥m时,dp[l][r][m] = dp[l][i - 1][i的权值 + 1] + dp[i + 1][r][i的权值 + 1]
求得dp[l][r][m]最小值后,再给dp[l][r][m]加上[l, r]每个节点的访问频度。
这道题目就是默认了,每个权值都可以取到。
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue> #define N 87
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,K;
struct Node
{
int v,w,f;
friend bool operator<(Node x,Node y)
{
return x.v<y.v;
}
}a[N];
int f[N][N][N],stk[N],tot;
int sum[N]; int main()
{
n=read(),K=read();
for (int i=;i<=n;i++)
a[i].v=read();
for (int i=;i<=n;i++)
a[i].w=read(),stk[++tot]=a[i].w;
for (int i=;i<=n;i++)
a[i].f=read();
sort(stk+,stk+n+);
for (int i=;i<=n;i++)
a[i].w=lower_bound(stk+,stk+n+,a[i].w)-stk;
sort(a+,a+n+);
for (int i=;i<=n;i++)
sum[i]=sum[i-]+a[i].f;
memset(f,0x3f,sizeof(f));
for (int i=;i<=n+;i++)
for (int w=;w<=n;w++)
f[i][i-][w]=;
for (int w=n;w>=;w--)
for (int i=n;i>=;i--)
for (int j=i;j<=n;j++)
for (int k=i;k<=j;k++)
{
f[i][j][w]=min(f[i][j][w],f[i][k-][w]+f[k+][j][w]+K+sum[j]-sum[i-]);
if(a[k].w>=w) f[i][j][w]=min(f[i][j][w],f[i][k-][a[k].w]+f[k+][j][a[k].w]+sum[j]-sum[i-]);
}
int ans=0x7f7f7f7f;
for (int i=;i<=n;i++)
ans=min(ans,f[][n][i]);
printf("%d\n",ans);
}
bzoj 1564 [NOI2009]二叉查找树 区间DP的更多相关文章
- BZOJ 1564: [NOI2009]二叉查找树( dp )
树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值). 枚举m为根(p表示访问频率): 修改m的权值 ...
- 洛谷$P1864\ [NOI2009]$二叉查找树 区间$dp$
正解:区间$dp$ 解题报告: 传送门$QwQ$ 首先根据二叉查找树的定义可知,数据确定了,这棵树的中序遍历就已经改变了,唯一能改变的就是通过改变权值从而改变结点的深度. 发现这里权值的值没有意义,所 ...
- bzoj 1564 [NOI2009]二叉查找树(树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1564 [题意] 给定一个Treap,总代价为深度*距离之和.可以每次以K的代价修改权值 ...
- BZOJ 1564 :[NOI2009]二叉查找树(树型DP)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
- BZOJ 1564: [NOI2009]二叉查找树
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1564 Description Input Output 只有一个数字,即你所能得到的整棵树的访 ...
- [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
1564: [NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 612[Submit][Status] ...
- BZOJ 1260&UVa 4394 区间DP
题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...
- BZOJ 2933([Poi1999]地图-区间Dp)
2933: [Poi1999]地图 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 7 Solved: 7 [ Submit][ Status] ...
- BZOJ 1055 玩具取名(区间DP)
很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...
随机推荐
- 下落的树叶 (The Falling Leaves UVA - 699)
题目描述: 原题:https://vjudge.net/problem/UVA-699 题目思路: 1.依旧二叉树的DFS 2.建树过程中开个数组统计 //紫书源代码WA AC代码: #include ...
- (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(3)
@author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 说明 1.本篇是接着-----(原) MaterialEditor部- UmateriaE ...
- numpy切片和布尔型索引
numpy 标签(空格分隔): numpy 数据挖掘 切片 数组切片是原始数组的视图.这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上 In [16]: arr Out[16]: arr ...
- [LeetCode] 53. Maximum Subarray 解题思路
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- HDU 4115 Eliminate the Conflict(2-SAT)(2011 Asia ChengDu Regional Contest)
Problem Description Conflicts are everywhere in the world, from the young to the elderly, from famil ...
- centos环境配置(nginx,node.js,mysql)
1.安装 Install GCC and Development Tools on a CentOS yum group install "Development Tools" n ...
- allocator类
一.动态数组 [new的局限性] new将内存分配和对象构造组合在一起,同样delete将对象析构和内存释放组合在一起 我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起(我们知道对象应有什 ...
- DAY4敏捷冲刺
站立式会议 工作安排 (1)服务器配置 已完成对微信小程序登录凭证储存至云端数据库,计划使用微信接口返回的session_id进行转化返回本地,以保持登录态. (2)数据库配置 单词学习记录+用户信息 ...
- 哈希表 STL map
计数排序时我们使用一个数组来记录出现的数字的次数,而当数据范围太大时,无法建立一个那么大地数组(而且可能空间利用率很低,太浪费),此时可以改用hash table . binary search tr ...
- iOS开发跳转指定页面
for (UIViewController *VC in self.navigationController.viewControllers) { if ([VC isKindOfClass:[Car ...