[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 ...
随机推荐
- CodeForces Round #521 (Div.3) D. Cutting Out
http://codeforces.com/contest/1077/problem/D You are given an array ss consisting of nn integers. Yo ...
- 【SSH】——Struts2中的动态方法调用(二)
当action中的方法有很多时,那应该怎么调用呢?上次我们提到的UserAction类中只有一个execute方法,如果我们需要增加用户的增删改查方法,如下: public class UserAct ...
- Java的sql语句 写关键字不需要添加单引号
Java的sql语句 写关键字不需要添加单引号
- Xinetd服务的安装与配置
Xinetd服务的安装与配置 http://blog.chinaunix.net/uid-21411227-id-1826885.html 1.什么是xinetd xinetd即extended in ...
- wya费用流
#include<bits/stdc++.h> using namespace std; #define M 1005 #define inf 0x7fffffff #define T 6 ...
- spring中@PropertySource注解的使用
概述: The @PropertySource annotation provides a convenient and declarative mechanism for adding aPrope ...
- java实现极简的LRU算法
import java.util.LinkedHashMap;import java.util.Map; /** * LRU (Least Recently Used) */public class ...
- koala 编译scss不支持中文解决方案
方法一: 在scss文件第一行加上代码:@charset "utf-8"; 方法二: 进入到Koala 安装目录 C:\Koala\rubygems\gems\sass-3.4.9 ...
- linux编译动态库 fPIC作用
在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无关代码. ...
- 在Unity(C#)下实现Lazy Theta*寻路
在上篇文章中我们介绍了Lazy Theta*.本篇中我会演示一下我实现的Lazy Theta*. 先上代码 //在一个点被expand时是否调用DebugOnExpanded事件,用于debug查看e ...