随笔分类 - POJ
摘要:关于环形dp的处理,我采用的办法是,把整个问题分成两个问题。 首先我们简化一下问题,假设这个问题不是环形的,那么我们定义f[i][j][1]表示前i个小时休息了j小时,且第i小时正在休息,获得的体力最大值。定义f[i][j][0]表示前i个小时休息了j小时,且第i小时不在休息,获得的体力最大值。显然
阅读全文
摘要:一道区间dp题,不少细节。 一开始我想定义f[i][j]表示区间[i,j]通过某种合并之后的最大值,之后这道题就等同于“NOI1995石子合并”。 但是转念一想,这道题有加法和乘法两种运算,如果单看加法,以上思路正确。但是因为乘法的存在,两个较小的数(负数)相乘或许会大于两个最大数相乘,因此以上思路
阅读全文
摘要:区间动态规划的经典题,关于区间dp,状态定义是很显然的,定义f[i][j]表示把i~j这一区间合并花费的最小值,若i=j,则f[i][j]=0,若i≠j,则在i,j当中必定有一点k,使得i,j的区间先合并成i,k和k+1,j,然后合并成i,j.因此,对于每一对i,j,我们都枚举k,那么f[i][j]
阅读全文
摘要:一道单调栈的基础题,我们建立一个单调上升的栈,当一个矩形被扫描时,如果他的高度大于栈顶就直接入栈,否则就不断取出栈顶,直到栈空或者栈顶小于当前矩形,在出栈的同时,我们累计被弹出的矩形宽度之和,每次弹出一个矩形,我们就用他的高度乘累计的宽度更新答案,出栈结束后,我们把一个高度为当前高度,宽度为累计宽度
阅读全文
摘要:这道题是洛谷“八数码难题”的升级版,洛谷只要求出最少步数,而本题要输出结果。 我们在搜索的时候记录每一个状态的前驱,最后输出的时候递归即可。 我们采用A*算法进行搜索,设计估价函数为当前状态每个点与目标状态每个点的曼哈顿距离之和。在搜索时建立一个小根堆维护即可。 代码细节比较多,注意对细节的处理。可
阅读全文
摘要:最短路是一个妇孺皆知的算法,可以用多种方法解决。但是第k短路…… 以Dijkstra为例,对于s->t的第k短路,即t点在堆中第k次取出的结果。 于是我们想到了一个朴素的算法:用Dijkstra反复执行,直到t点在堆中第k次取出时结束。 考虑一下优化:用A*算法优化。 根据A*估价函数的设计原则,x
阅读全文
摘要:确实是一道经典的深搜好题,(不过POJ不都是这样吗……)。 首先这道题爆搜就死定了,所以咱们考虑一些剪枝。 1.对所有的木棍按长度降序排序,先尝试较长的木棍,这样可以减少搜索树的分支。 2.定义一个变量,记录最近一次搜索失败的木棍的长度,若即将搜索的长度与之相等,则直接跳过。 3.如果在原始木棒“加
阅读全文