摘要: 题意:一只蜗牛将壳忘在了一棵树的某一个末结点(叶子)上。它想找回自己的壳,但忘记是丢在哪个结点上了,只好从树根开始网上爬,一个结点一个结点地找。在一些结点上居住着毛毛虫,它们会告诉蜗牛该结点以及它的子树上是否有它的壳,这样可以节省些时间。两个结点如果相连,则距离为1。问蜗牛找到壳的最小期望距离为多少。 接着给了一个例子(上图): 假如蜗牛以结点2,4,5的顺序找,则壳分别在结点2,4,5时它需要爬行的距离为1,4,6。则它找到壳的期望为(1 + 4 + 6) / 3 = 11/3。 考虑另一种情况,假设蜗牛先往结点3的方向爬,而在结点3处有毛毛虫,它可以告诉毛毛虫有关壳的信息... 阅读全文
posted @ 2013-08-23 21:46 fenshen371 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 题意:略。思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行。这里用dp[row][state1][state2]表示第row行状态为state2,第row-1行状态为state1时最多可以安放多少大炮。则递推公式为:dp[i][K][J] = max(dp[i-1][L][K] + num[J])。其中num[J]表示状态J的二进制形式里有多少个1。代码我是参考的别人的,觉得写得很好。主要有一下几个地方:1. 在判断一个数二进制形式有多少个1时,用 x & (x - 1) (具体见代码count_one函数)来判断。这种方法的时间复杂度就是x的二 阅读全文
posted @ 2013-08-21 20:42 fenshen371 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 题意:略。思路:这一题开始做的时候完全没有思路,便去看了别人的题解。首先,对于这个题目解法想有一个初步的了解,请看这里:http://www.2cto.com/kf/201208/146894.html根据这篇讲解,写了一篇扭曲的代码,提交之后TLE。经过排查分析之后发现,算法的复杂度为O(hw*(2^(2w))),这个复杂度肯定超了。后来进行了优化,如果两种状态可以匹配,就将它们用邻接表(vector实现)存储起来,这样只需一遍预处理,以后直接读取就可以了。此外,还有两个地方的优化:1. 如果h*w为奇数,则结果必为0。(每个砖块的面积为2,无法用整数块铺满)2. 如果h 2 #inclu. 阅读全文
posted @ 2013-08-20 11:17 fenshen371 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 题意:略。思路:第一次做状态压缩的dp。在这里说一下状态压缩的原则。因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量从0枚举到2^12 - 1。对于每一个数,将其转换成二进制,先判断格子为0时该数二进制对应位上是不是1,若是则该状态不可行。其次再判断该数相邻的两位有没有同时为1的情况,如果有,该状态也不可行。递推公式就是:dp[i][k] = dp[j][k-1]。其中dp[i][k]表示在牧场第k行状态为i时可行解的数量。它等于上一层所有可行状态的可行解数量之和。在dp过程中,在判断该层的上一层某状态是否可行时, 阅读全文
posted @ 2013-08-19 16:22 fenshen371 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 题意:略。思路:第一次写的时候搞复杂了,弄得跟计算几何似的= =递推公式很好想,就是dp[x2][y2][t] = max(dp[x2][y2][t], dp[x1][y1][t-1] + online(x2, y2, x1, y1)。其中dp[x2][y2][t]表示在时间点t锤子选择砸到点(x2, y2)处时的最大积分,点(x1, y1)与点(x2, y2)距离不大于d,online函数计算的是以这两点为端点的线段上有几只地鼠。另外,本题中锤子可以砸到坐标系外面,如果不考虑此种情况会wa。处理方法是,读取坐标时横纵坐标都加5(5为锤子可移动距离d的最大值)。更多细节见代码即注释。 1 #i 阅读全文
posted @ 2013-08-19 10:21 fenshen371 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 题意:略。思路:大家多看看题目当中这个图发现每次蜘蛛侠在空中发射蛛丝的位置都是与起点公寓的高度相同的(高中物理机械能守恒)。因此这个高度就不用计算了。题目的重点是想出dp的递推公式。现在先考虑一个问题,已知一栋大楼j的高度和x轴坐标和起点公寓的高度(公寓高度决定了蜘蛛侠发射蛛丝的高度),在x轴坐标多少范围内蜘蛛侠可以成功发射蛛丝荡过该大楼呢?考虑极限情况,蜘蛛侠荡到最低点时正好贴着地面,则此时蛛丝的长度为大楼j的高度h[j]。则在距离地面高度为h[1](起点公寓的高度)时蜘蛛侠发射了该蛛丝,此时与大楼j的水平距离为sqrt(h[j] ^ 2 - (h[j] - h[i]) ^ 2)设该点为st 阅读全文
posted @ 2013-08-18 20:44 fenshen371 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 题意:不想复述了。。好累。。思路:yey矿只能由东向西运送,用数组yey[i][j]表示地图中从(i, 1), (i, 2), ... 到 (i, j)的yey矿总量。blog矿只能由南向北运送,用数组blog[i][j]表示地图中从(1, j), (2, j), ... 到 (i, j)的blog矿总量。而dp[i][j]表示左上顶点为(1, 1),右下顶点为(i, j)的矩形内按照题意可运送的矿产总量的最大值。则关键点就是位于(i, j)处的矿产。可以有两种选择,一种是从该点建一条向北的blog矿的传送带,另一种是从该点建一条向西的yey矿的传送带。由此可得dp的递推公式:dp[i][j] 阅读全文
posted @ 2013-08-17 20:41 fenshen371 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 题意:平面上有一些给定的点,用一个给定大小的矩形(不能旋转)来框住最多的点。思路:预处理出所有左上顶点为(1, 1),右下顶点为(x, y)的矩形里点的数量,用dp[x][y]存储。我也不知道这种方法是不是dp。。。总之,题很水。 1 #include 2 #include 3 #include 4 using namespace std; 5 int dp[110][110]; 6 int main() 7 { 8 //freopen("data.in", "r", stdin); 9 int n;10 while (~scanf("%d&q 阅读全文
posted @ 2013-08-17 07:49 fenshen371 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 题意:给一个字符串,通过删除字符或者添加字符将它变成回文串。给出删除或添加每一个字符的费用,求最小费用。思路:刚开始学习dp,觉得dp最重要的就是发现问题与子问题的递推关系了。这里用dp[i][j]表示字符串从i到j变成回文串的最小花费。假设id[i] = id[j],则dp[i][j] = dp[i+1][j-1]。如果不相等,有dp[i][j] = min(dp[i+1][j] + cost[ id[i]-'a' ], dp[i][j-1] + cost[ id[j]-'a' ])。具体分析如下假设i到j构成的子串为akkk...kkkkd,有如下四种选择将 阅读全文
posted @ 2013-08-16 17:52 fenshen371 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 这个题分类是dp,想了一会没有想出来,就去看别人题解了。发现别人题解全是暴力枚举= =。复杂度超过 N^2,但可能是剪枝的作用,没有超时。思路:将所有点按坐标由小到大排序。两两枚举点p1,p2,并判断其中坐标较小的点p1是否是该路径上青蛙跳至的第一个点(假设在p1之前还有一点,则可以根据p1和p2的距离算出p1前一点的坐标,判断该坐标是否在麦田内,若不在则说明p1是青蛙跳至的第一个点)。判定p1前一点坐标时,我原以为由于所有点的坐标都是排好序的(从小到大),则p1前一点的坐标必然更小,因此判定它是否在麦田内时只需要判断是否坐标都大于0,并不需要判断是否超坐标上限。但这种思路是错误的。见下图。上 阅读全文
posted @ 2013-08-16 10:55 fenshen371 阅读(251) 评论(0) 推荐(0) 编辑