[BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
1564: [NOI2009]二叉查找树
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 879 Solved: 612
[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
观察到这就是一个treap。(其实没什么卵用)
设sum为访问频率的前缀和。
考虑dp,设f[w][i][j]表示从i到j组成根节点为原权值第w小之后的点的最小总代价。
第一位从原来权值最大的点开始枚举w。
之后两维枚举i,j。
下一维枚举分割点d。
分两种情况讨论:
1.若修改点d的权值,那么f[w][i][j]=min(f[w][i][j],f[w][i][d-1]+f[w][d+1][to]+sum[to]-sum[i-1]+k);
2.若不修改点d的权值,那么点d的权值要大于m,f[w][i][j]=min(f[w][i][j],f[t[d].a][i][d-1]+f[t[d].a][d+1][to]+sum[to]-sum[i-1]);
ans=f[1][1][n]
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 80
using namespace std;
int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
int n,k;
struct data {
int v,a,p;
}t[maxn];
bool cmp1(data t1,data t2) {return t1.a<t2.a;}
bool cmp2(data t1,data t2) {return t1.v<t2.v;}
int sum[maxn];
int f[maxn][maxn][maxn];
int main() {
n=read();k=read();
for(int i=;i<=n;i++) t[i].v=read();
for(int i=;i<=n;i++) t[i].a=read();
for(int i=;i<=n;i++) t[i].p=read();
sort(t+,t+n+,cmp1);
for(int i=;i<=n;i++) t[i].a=i;
sort(t+,t+n+,cmp2);
for(int i=;i<=n;i++) sum[i]=sum[i-]+t[i].p;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(t[i].a>=j) f[j][i][i]=t[i].p;
else f[j][i][i]=t[i].p+k;
for(int w=n;w>=;w--) {
for(int j=;j<=n;j++) {
for(int i=;i+j<=n;i++) {
int to=i+j;
int tmp=;
for(int d=i;d<=to;d++) {
if(t[d].a>=w) tmp=min(tmp,f[t[d].a][i][d-]+f[t[d].a][d+][to]+sum[to]-sum[i-]);
tmp=min(tmp,f[w][i][d-]+f[w][d+][to]+sum[to]-sum[i-]+k);
}
f[w][i][to]=tmp;
}
}
}
printf("%d",f[][][n]);
}
[BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp的更多相关文章
- 洛谷 1063 dp 区间dp
洛谷 1063 dp 区间dp 感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态.. 初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, ...
- 【BZOJ4565】【HAOI2016】字符合并 [状压DP][区间DP]
字符合并 Time Limit: 20 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为 n 的 01 串,你 ...
- Treats for the Cows POJ - 3186 dp 区间dp
//dp[i][j]表示第i次从左边取,第j次从右边取的价值,所以我们可以得到状态方程 //dp[i][j]=max(dp[i-1][j]+(i+j)*a[i],dp[i][j-1]+(i+j)*a[ ...
- 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)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
- bzoj1564: [NOI2009]二叉查找树
dp. 首先这棵树是一个treap. 权值我们可以改成任意实数,所以权值只表示相互之间的大小关系,可以离散化. 树的中序遍历是肯定确定的. 用f[l][r][w]表示中序遍历为l到r,根的权值必须大于 ...
- poj1651 区间dp
//Accepted 200 KB 0 ms //dp区间 //dp[i][j]=min(dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]) i<k<j #include ...
- POJ 1141 Brackets Sequence (区间DP)
Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...
随机推荐
- Promise使用手册
导读 Promise问世已久, 其科普类文章亦不计其数. 遂本篇初衷不为科普, 只为能够温故而知新. 比如说, catch能捕获所有的错误吗? 为什么有些时候会抛出"Uncaught (in ...
- JMS实战——ActiveMQ实现Pub-Sub
前言 上篇博客<JMS实战--ActiveMQ>介绍了ActiveMQ的安装,并实现了简单的PTP模型.这篇博客我们来看一下Pub-Sub模型,之后来总结一下JMS. 实现 项目结构 其中 ...
- Linux杂技
挂载光盘 mkdir /mnt/cdrom #建立挂载点 mount /dev/cdrom /mnt/cdrom/ #挂载光盘 更换YUM源: cd /etc/yum.repos.d/ 使网络yum源 ...
- Java集合整体框架
Java中的集合类有List.Set.Map Collection的实现类:List.Set List的实现类:ArrayList.LinkedList.Vector Set的实现类:HashSet. ...
- 大并发量订单处理的 KafKa部署
大并发量订单处理的 KafKa部署总结 今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为公司 ...
- BZOJ4602 SDOI2016齿轮(搜索)
dfs一遍给每个齿轮随便标个值看是否矛盾就行了. #include<iostream> #include<cstdio> #include<cmath> #incl ...
- hdu 1856 More is better (并查集)
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) ...
- null?对象?异常?到底应该如何返回错误信息
这篇文章记录我的一些思考.在工作了一段时间之后. 问题的核心很简单:到底如何返回错误信息. 学生时代,见到过当时的老师的代码: if (foo() == null) { } 当然,这位老师是一位比较擅 ...
- CLion 终于支持 jump outside closing bracket/quote with Tab 了!
我觉得这个 feature 真的很有用.一直期待 CLion 加上这个 feature.今天才知道最新版本(CLion 2018.3.4)中已经有这个功能了,不过我不清楚从哪个版本开始支持的. How ...
- 洛谷 P2387 [NOI2014]魔法森林 解题报告
P2387 [NOI2014]魔法森林 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2 ...