bzoj1564: [NOI2009]二叉查找树
dp。
首先这棵树是一个treap。
权值我们可以改成任意实数,所以权值只表示相互之间的大小关系,可以离散化。
树的中序遍历是肯定确定的。
用f[l][r][w]表示中序遍历为l到r,根的权值必须大于w的最小代价。
当a[x].w<=w时有f[l][r][w]=min(f[l][x-1][w]+f[x+1][r][w]+s[l][r]+k).s[i][j]表示从l到r访问次数的和。
当a[x].w>w时,还有f[l][r][w]=min(f[l][x-1][w]+f[x+1][r][w]+s[l][r]).不用修改了。
对于[1,n]来说,根的权值只存在改和不改俩种状态。所以res=min(f[1][n][0],f[1][n][1])。
必须是这俩个取min,如果只取0的话,就会忽略根为原树的根的答案。
否则就会忽略根不为原树的答案(这不是废话么。。其实因为新根能改为小于1,如果只能改为1的话,原根的权值还要变大)。
用一个res作为引用可以不用打那么一长串(膜lrj巨神)
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int maxn = 70 + 10;
const LL inf = 0x3f3f3f3f3f3f3f3fll; struct Point {
int v,w,d;
}a[maxn];
int n,k;
LL f[maxn][maxn][maxn],s[maxn],res; bool cmp1(Point p1,Point p2) {
return p1.w<p2.w;
} bool cmp2(Point p1,Point p2) {
return p1.v<p2.v;
} LL DP(int l,int r,int w) {
if(l>r) return 0;
if(f[l][r][w]!=inf) return f[l][r][w]; for(int x=l;x<=r;x++) {
LL& res=f[l][r][w];
res=min(res,DP(l,x-1,w)+DP(x+1,r,w)+s[r]-s[l-1]+k);
if(a[x].w>w)
res=min(res,DP(l,x-1,a[x].w)+DP(x+1,r,a[x].w)+s[r]-s[l-1]);
}
return f[l][r][w];
} int main() {
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i].v);
for(int i=1;i<=n;i++) scanf("%d",&a[i].w);
for(int i=1;i<=n;i++) scanf("%d",&a[i].d);
sort(a+1,a+n+1,cmp1);
for(int i=1;i<=n;i++) a[i].w=i;
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=n;i++) {
a[i].v=i;
s[i]=s[i-1]+a[i].d;
}
memset(f,0x3f,sizeof(f));
printf("%lld\n",min(DP(1,n,0),DP(1,n,1)));
return 0;
}
bzoj1564: [NOI2009]二叉查找树的更多相关文章
- [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
1564: [NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 612[Submit][Status] ...
- BZOJ1564 NOI2009二叉查找树(区间dp)
首先按数据值排序,那么连续一段区间的dfs序一定也是连续的. 将权值离散化,设f[i][j][k]为i到j区间内所有点的权值都>=k的最小代价,转移时枚举根考虑是否修改权值即可. #includ ...
- [BZOJ1564][NOI2009]二叉查找树(区间DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1564 分析: 首先因为每个点的数据值不变,所以无论树的形态如何变,树的中序遍历肯定不变 ...
- BZOJ 1564: [NOI2009]二叉查找树( dp )
树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值). 枚举m为根(p表示访问频率): 修改m的权值 ...
- bzoj 1564 [NOI2009]二叉查找树 区间DP
[NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 906 Solved: 630[Submit][Status][Discu ...
- P1864 [NOI2009]二叉查找树
链接P1864 [NOI2009]二叉查找树 这题还是蛮难的--是我菜. 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质: 首先不管怎么转,中序遍历是确定的,所 ...
- NOI2009 二叉查找树 【区间dp】
[NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...
- BZOJ 1564 :[NOI2009]二叉查找树(树型DP)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
- [洛谷P1864] NOI2009 二叉查找树
问题描述 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结点的权值都比它的 ...
随机推荐
- Java Api与HBase交互实例
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hb ...
- ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法
偶原来的用ASP.NET生成验证码图片时用的是JPG格式,今天想把它改成PNG格式的,结果就出现GDI+一般性错误,查了N久资料,才发现解决的办法,对分享此解决办法的网友深表感谢 Response.C ...
- codeforces 463D Gargari and Permutations(dp)
题目 参考网上的代码的... //要找到所有序列中的最长的公共子序列, //定义状态dp[i]为在第一个序列中前i个数字中的最长公共子序列的长度, //状态转移方程为dp[i]=max(dp[i],d ...
- HDU 4825 Xor Sum(二进制的字典树,数组模拟)
题目 //居然可以用字典树...//用cin,cout等输入输出会超时 //这是从别处复制来的 #include<cstdio> #include<algorithm> #in ...
- ZOJ 2677 Oil Deal(最大生成树)
题意:破坏石油管道,现一直破坏各个管道所要付出的代价,问在有一定money并且要保证剩余的管道为生成树的情况下, 最多能破坏多少个管道,并将他们的编号从小到大输出来 思路:将边从大到小排序,构造生成树 ...
- 学习android的博客
http://www.cnblogs.com/hll2008/http://svn.apache.org/repos/asf/http://blog.csdn.net/chenzheng_javaht ...
- ***Jquery下Ajax与PHP数据交换
一.前台传递字符串变量,后台返回字符串变量(非json格式) Javascript代码: 这里,为了解决Ajax数据传递出现的汉字乱码,在字符串传递之前,使用javascript函数escape()对 ...
- mysql 连接数的最大数
mysql默认最大连接数是100,增加加默认MYSQL连接数的方法有两个 方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini(windows) 或 my.cnf(linux环境)查找 ...
- lintcode:Ugly Number I
Ugly Number Write a program to check whether a given number is an ugly number`. Ugly numbers are pos ...
- Redis 集群实现
Nosql,作为程序员在当下不了解点儿,还真不行,出去聊起来别人就会说你土.那么就聊聊其中一个比较火的redis.redis单机版没得说,但是一直没有集群版,有也是山寨的.前段时间对redis的实现进 ...