这道题我想了一天才想清楚做法。AC 了之后去看别人写的题解,都是三言两语意识流式描述,我并不能读懂。我觉得很自卑,为何人家解这道题如此轻松。不过,我还是决定把我的解法写下来,并且一定要写清楚。


思路

我想多数人见到这个题目的想法都是:先按照某种方式对三角形排序,再设法 DP 。大方向确实如此。我的做法是:「以三角形底边的右端点坐标为第一关键字从小到大,以三角形底边的左端点坐标为第二关键字从大到小」排序。记排序后的 $n$ 个三角形为:$T_1, T_2, \dots, T_n$ ,如此排序使得:

  1. 所有被 $T_i$ 覆盖且不与 $T_i$ 重合的三角形都排在 $T_i$ 前面
  2. 设 $0 \le k< j < i \le n$ 且 $T_j \not\subseteq T_i, T_k \not\subseteq T_i$ 那么 $(T_k \cap T_{i}) \subseteq (T_j \cap T_i)$

我不清楚是否还有别的排序方法也能满足上面两个条件,不过其他排序方法只要满足上述两性质,都可进而采用下面要讲的 DP 方法。

DP 状态 $\DeclareMathOperator{\DP}{DP}$

$\DP_i$ 表示「只在前 $i$ 个金字塔(即三角形)中选择一些建造并且一定建造第 $i$ 座金字塔,所能获得的最大收益」。

边界条件

为了方便我们定义第 $0$ 座金字塔为 $(-\infty, 0, 0)$ 。
边界条件为 $\DP_0 = 0$ 。

转移方程

$$
\DP_i = \max \left\{ \DP_j + \sum_{j< k< i, T_k \subseteq T_i} T_k.w + T_i.w - \left | T_i \right | + \left| T_j \cap T_i\right|\right\} \quad (0 \le j <i, T_j \not\subseteq T_i)
$$

$\left| T \right|$ 表示(等腰直角)三角形 $T$ 的 面积。

复杂度 $O(N^2)$ 。

这就是我的思路,当然还可以做一些小优化。代码就不贴了,我的目标是把思路说清楚,思路清楚了,代码并不难写。

总结

这道题目应当算作简单题,虽然我解得并不轻松。这个问题中,三角形其实可以简化为底边所表示的线段,设底边长为 $l$,则三角行面积 $s$ 可表为 $s = s(l) =l^2/4$ 。这个问题可一般化为:给定若干条 $x$ 轴上的线段,每条线段有一个收益值,另外给出一个成本函数 $cost(l)$ 。其他部分和原具体问题相似,不赘述。

hihoCoder #1157 建造金字塔的更多相关文章

  1. hihocoder #1270 建造基地

    传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在遥远的未来,小Hi成为了地球联邦外空间联合开发工作组的一员,前往一颗新发现的星球开发当地的重金属资源. 为了能够 ...

  2. Computer Vision_33_SIFT:Distinctive Image Features from Scale-Invariant Keypoints——2004

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  3. [swustoj 585] 倒金字塔

    倒金字塔(0585) Time limit(ms): 3000 Memory limit(kb): 65535 Submission: 208 Accepted: 48   Description S ...

  4. [Swust OJ 585]--倒金字塔(LIS最长不下降子序列)

    题目链接:http://acm.swust.edu.cn/problem/585/ Time limit(ms): 3000 Memory limit(kb): 65535   SWUST国的一支科学 ...

  5. [Offer收割] 编程练习赛1

    A HihoCoder 1268 九宫 思路: 一般类似于数独的题目都是使用回溯解决,这里由于题目数据较小同样可以直接DFS得出结果.这里我用了一个偷懒的方法(next_permutation),直接 ...

  6. (纪录片)数学的故事 The Story of Maths (2008)

    简介: 导演: Robin Dashwood编剧: Marcus du Sautoy主演: Marcus du Sautoy类型: 纪录片官方网站: www.bbc.co.uk/programmes/ ...

  7. NEERC 15 (10/12)

    NEERC=Not Easy European Regional Contest 据说NEERC天天被搬,赶紧做了好了.在Claris和Google的帮助下做了10题,感谢cls. http://co ...

  8. Computer Vision_33_SIFT:Object recognition from local scale-invariant features——1999

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  9. 项目的基本概念(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 我一看到这个标题就头疼,好吧,又是概念,好在我不要参加相关的考试,否则文字连同标点符号都得背%¥#%#~ 张同学说,项目& ...

随机推荐

  1. [转]maven项目部署到tomcat

    其实maven项目部署到tomcat的方式很多,我从一开始的打war包到tomcat/webapps目录,到使用tomcat-maven插件,到直接使用servers部署,一路来走过很多弯路. 下面就 ...

  2. ThinkPHP笔记——开启debug调试模式

    debug+trace模式可以查看开发过程中TP的错误信息,可以更好地帮助开发者debug.但是debug模式的开启还不是简单的在配置文件中中设置就可以的,经过查资料摸索,找到一种有效的方法. 首先在 ...

  3. 2015 ACM/ICPC Asia Regional Changchun Online Pro 1002 Ponds(拓扑排序+并查集)

    Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  4. 面试题-谈谈你对Java平台的理解

    平台无关性 GC 语言特性 面向对象 类库 异常处理 一次编译到处运行 JVM如何加载Class文件 Java反射 ClassLoader 种类 双亲委派机制 loadcalss和forName

  5. java中Integer和int的区别

    亲看这里 例子: public class Test { public static void main(String[] args) { Integer i = new Integer(128); ...

  6. VIM+ctags+cscope用法

    使用vim + cscope/ctags,就能够实现Source Insight的功能,可以很方便地查看分析源代码.   关键词: vim, cscope, ctags, tags   1. 查看vi ...

  7. 01_3_创建一个Action

    01_3_创建一个Action 1. 定义一个action 具体视图的返回可以由用户自己定义的Action来决定 具体的手段是根据返回的字符串找到相应的配置项,来决定视图的内容 具体Action的实现 ...

  8. C++ 学习笔记(二) const的加强

    const 含义为只读.如果在程序中显式改变const变量那么编译会报错. C语言的const: 在C语言中const 变量是放在内存中,如果使用指针可以间接改变const变量.所以在C语言中cons ...

  9. [LUOGU] P4251 [SCOI2015]小凸玩矩阵

    行列看成点,格子看成边,二分一个边权,删去大于它的边,新图上的最大流>k则答案可以更优,小于k则调整左边界. #include<algorithm> #include<iost ...

  10. setup/hold 分析

    分析说明:D2:目的寄存器:D1:源寄存器: edge2:下一个时钟上升沿:edge1:当前时钟上升沿:edge0:当前时钟上升沿的前一个时钟沿:如下图: 建立时间:触发器D2(数据要到达目的的地方) ...