可以修建的缆车总数不超过n,于是可以先通过$O(n^2)$的枚举求出所有可以修建的缆车。

对于一个缆车,若它仅连接i和i+1,那么它不受k的限制,把这种缆车额外取出,从大到小排序。

剩下的缆车两两之间要么是包含关系,要么没有任何交集,按照包含关系可以建出一棵树。

设f[i][j][k]表示以i为根的子树中修建了j个缆车,且该区间内所有点上面的缆车数的最大值为k的最优解。

则对于x的孩子i,通过枚举a,b,c,d,可以得到:

f'[x][a+c][max(b,d)]=max(f'[x][a+c][max(b,d)],f[x][a][b]+f[i][c][d])

可以通过讨论b和d的大小关系,维护两个前缀最大值来省去d的枚举。

如果把a的枚举上界定为x之前部分的子树大小,c的枚举上界定为i的子树大小,那么对于树上的两个点,只会在它们的lca处被DP到,所以这个树形DP的时间复杂度为$O(kn^2)$。

最后统计答案时,只要枚举修建的受k限制的缆车数和不受k限制的缆车数,取个最大值即可。

#include<cstdio>
#include<algorithm>
#define rep(i,l,n) for(int i=l;i<=n;i++)
#define dep(i,n,l) for(int i=n;i>=l;i--)
using namespace std;
const int N=210,inf=~0U>>2;
int T,n,m,i,j,k,flag,x[N],y[N],cnt,one,b[N],g[N],nxt[N],ans;
int size[N],f[N][N][10],t[N][10];
struct P{int l,r,w;P(){}P(int _l,int _r,int _w){l=_l,r=_r,w=_w;}}a[N];
inline bool cmp(int x,int y){return x>y;}
inline void up(int&a,int b){if(a<b)a=b;}
void dfs(int x){
rep(a,0,m)rep(b,0,k)f[x][a][b]=-inf;f[x][0][0]=0;
for(int i=g[x];i;i=nxt[i]){
dfs(i);
dep(a,min(size[x]+size[i],m),0)rep(b,0,k)t[a][b]=f[x][a][b];
dep(a,min(size[x],m),0)dep(c,min(size[i],m-a),0){
int t1=-inf,t2=-inf;
rep(b,0,k){
up(t1,f[i][c][b]);
up(t2,f[x][a][b]);
up(t[a+c][b],max(f[x][a][b]+t1,f[i][c][b]+t2));
}
}
size[x]+=size[i];
dep(a,min(size[x],m),0)rep(b,0,k)f[x][a][b]=t[a][b];
}
if(!x)return;
size[x]++;
dep(a,min(size[x],m-1),0)dep(b,k-1,0)up(f[x][a+1][b+1],f[x][a][b]+::a[x].w);
}
int main(){
while(~scanf("%d%d%d",&n,&m,&k)){
k--;
rep(i,1,n)scanf("%d%d",&x[i],&y[i]);
rep(i,1,n)rep(j,i+1,n)if(y[i]==y[j]){
flag=1;
rep(k,i+1,j-1)if(y[k]>=y[i]){flag=0;break;}
if(flag){
if(i+1==j){
b[++one]=x[j]-x[i];
}else{
a[++cnt]=P(i+1,j-1,x[j]-x[i]);
}
}
}
if(one>1)sort(b+1,b+one+1,cmp);
rep(i,2,one)b[i]+=b[i-1];
rep(i,1,cnt){
j=0;
rep(k,1,cnt)if(a[k].l<a[i].l&&a[k].r>a[i].r)if(!j||a[k].w<a[j].w)j=k;
nxt[i]=g[j],g[j]=i;
}
dfs(0);
ans=-1;
rep(i,m-one,m)rep(j,0,k)up(ans,f[0][i][j]+b[m-i]);
printf("Case %d: %d\n",++T,ans);
rep(i,0,cnt)g[i]=size[i]=0;
cnt=one=0;
}
return 0;
}

  

BZOJ4254 : Aerial Tramway的更多相关文章

  1. 【BZOJ4254】Aerial Tramway 树形DP

    [BZOJ4254]Aerial Tramway 题意:给你一座山上n点的坐标,让你在山里建m条缆车,要求缆车两端的高度必须相等,且中间经过的点的高度都小于缆车的高度.并且不能存在一个点位于至少k条缆 ...

  2. 【刷题】BZOJ 4254 Aerial Tramway

    Description You own a park located on a mountain, which can be described as a sequence of n points ( ...

  3. 微信emoji的code

    const MAP = [        "\xc2\xa9" => 'COPYRIGHT SIGN',        "\xc2\xae" => ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 泡泡一分钟:Cooperative Object Transportation by Multiple Ground and Aerial Vehicles: Modeling and Planning

    张宁 Cooperative Object Transportation by Multiple Ground and Aerial Vehicles: Modeling and Planning 多 ...

  6. 泡泡一分钟:Motion Planning for a Small Aerobatic Fixed-Wing Unmanned Aerial Vehicle

    Motion Planning for a Small Aerobatic Fixed-Wing Unmanned Aerial Vehicle Joshua Levin, Aditya Paranj ...

  7. A Multi-Sensorial Simultaneous Localization and Mapping (SLAM) System for Low-Cost Micro Aerial Vehicles in GPS-Denied Environments

    A Multi-Sensorial Simultaneous Localization and Mapping (SLAM) System for Low-Cost Micro Aerial Vehi ...

  8. 大气散射 Aerial Perspective

    http://mathinfo.univ-reims.fr/IMG/pdf/PreethamSig2003CourseNotes.pdf https://blog.csdn.net/toughbro/ ...

  9. 泡泡一分钟:Real-Time Vehicle Detection from Short-Range Aerial Image with Compressed MobileNet

    张宁 Real-Time Vehicle Detection from Short-Range Aerial Image with Compressed MobileNet链接:https://pan ...

随机推荐

  1. 项目中经常用到的JavaScript方法

    1. js切割字符串 String.split() 注意:此方法与Array.join执行的方法是相反的. 2. js把数组中所有元素放入一个字符串 Array.join()

  2. SQL记录-Linux CentOS配置ORACLE 12c

    1.准备LIINX软件包 操作系统:centos7 虚拟机:VMware 12 JDK:1.8 数据库:oracle 12c 2.配置基础环境 2.1 部署虚拟机VM(过程略) 2.2 部署操作系统C ...

  3. pandas 实现通达信里的MFI

    pandas 实现通达信里的MFI 算法里的关键点: combine()和rolling().sum()方法 combine -- 综合运算, rolling().sum() -- 滚动求和 利用pd ...

  4. ASP.Net巧用窗体母版页

    背景:每个网页的基本框架结构类似: 浏览网站的时候会发现,好多网站中,每个网页的基本框架都是一样的,比如,最上面都是网站的标题,中间是内容,最下面是网站的版权.开发提供商等信息: 在这些网页中,表头. ...

  5. TrID文件类型识别linux版

    读取文件头根据特征码进行文件类型匹配. 官方:http://mark0.net/soft-trid-e.html windows版本小工具:FileAnalysis 以下是linux版本 wget h ...

  6. 字符串格式化(百分号&format)

    字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号方式: %[(name)][flags][width].[precision]typecode [  ]:表示 ...

  7. su: cannot set user id: Resource temporarily unavailable【转】

    今天R&D所在主机出现su: cannot set user id: Resource temporarily unavailable资源不可用报错,直接通过其他机器ssh huyuh@xxx ...

  8. 初始ADO.NET数据操作

    以下介绍直接来源与百度百科,介绍十分全面和详细,作为小菜的我们没有理由不看完这些枯燥的介绍原有: ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于 ...

  9. (转载)mysql:“Access denied for user 'root'@'localhost'”

    原文地址:http://www.linuxidc.com/Linux/2007-05/4338.htm # /etc/init.d/mysql stop# mysqld_safe --user=mys ...

  10. 解决C/C++语言中全局变量重复定义的问题

    前言 今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面.于是,想把自己的代码中的各个模块分离开来,以便更好地阅读和管理. 遇到的问题 我的做法是: 宏定义.结构体定义.函 ...