|
|
|
|
|
摘要:
本题是一个显然的动态规划题目。设计状态时,用f[i,j,1]表示第i段时间为止,已睡去j个时间段,且第i段时间睡觉获得的最大效用。反之,f[i,j,0]表示上述状态下[i]第i段时间不睡觉能获得的最大效用值。状态转移方程如下:f[i,j,0]:=Max{f[i-1,j,0],f[i-1,j,1]}f[i,j,1]:=Max{f[i-1,j-1,0],f[i-1,j-1,1]+u[i]}具体就不用多解释了,这题的关键不在方程上,而在于的是环形Dp的处理。上述方程从i=1开始顺推,推出的只能是第一段时间开始睡或者第一段时间没有睡的最大效用值,换句话说,就是无论如何没有把u[1]加入这个最大值中,但 阅读全文
posted @ 2011-09-01 17:53
This_poet
阅读(954)
推荐(0)
编辑
摘要:
最小点覆盖问题,采用匈牙利算法。证明一下算法的正确性:定义一段无法向左右扩展的连续泥地为行连通块,一段无法向上下扩展的连续泥地为列连通块。我们把行连通块对应X集合,列连通块对应Y集合,如果一个行连通块与一个列连通块有交点且为空地,则对应在二分图中有一条边。显然木板的集合对应二分图的一个匹配,任意两个木板不可能共同存在于一个行/列连通块中,所以最少木板数目=最大匹配数。证毕。Program POJ2226;//by_PoetshyConst maxn=50;Var i,j,k,m,n,sum,sum2,ans :Longint; map :Array[1..maxn,1.... 阅读全文
posted @ 2011-09-01 17:36
This_poet
阅读(276)
推荐(0)
编辑
摘要:
这道题是楼教主《男人八题》中的一题,算法:树的分治。看到题目时很容易想到直接Dfs,但那样的话时间复杂度会高达O(n^2)!对于n<=40000的数据来说根本无法承受。所以,必须考虑分治的思想。怎么分治呢?树的重心!至于树的重心,不熟悉的OIer可以做掉POJ1655,或者NOI2011 Day2的第一题来练手,这两道题要求的就是树的重心。至于pascal语言的ACMer可以考虑编译开关,OIer最好不要加编译开关,练一练非递归手写栈也是不错的。基本思路:1、把这棵无根树以1为根节点,使其变成一棵有根树。2、对于每棵现在要处理的树,进行如下处理:(1)遍历这棵树,找到所有一端点为根,路径 阅读全文
posted @ 2011-09-01 14:15
This_poet
阅读(697)
推荐(1)
编辑
摘要:
这是刘汝佳神牛《算法艺术与信息学竞赛》上有关堆的一道例题。主要思路如下:维护一个堆,存储的是水位和高度一样的格子的高度。1、首先把边缘点全部加到堆中2、每次取堆中最小的一个,做一次Floodfill,如果被fill到的点比队首元素高度高,那么将这个点加入堆中,否则将该点的水位设置为队首元素的水位。3、重复2,直到堆中没有元素。4、最后,统计答案为每个点水位高度与实际高度的差值和。CODE 1 const 2 maxn=90000; 3 maxp=300; 4 ddx:array[1..4]of integer=(0,0,1,-1); 5 ddy:arr... 阅读全文
posted @ 2011-08-31 20:17
This_poet
阅读(424)
推荐(0)
编辑
摘要:
开始的时候没有想出算法,上网查题解,居然有人说这题是动态规划……无奈。偶然间看到了上海交大马融牛的解题表格:只有一句话,从前向后扫描。才知道这道题用到的只不过是一个贪心思想。贪心思想:把序列划分成尽量多的连续子序列,使得每一个连续子序列都满足如下条件:1..k每个数字都在这个子序列中出现过一次,并且至少有一个数字只出现过一次。这样的子序列的个数+1就是答案贪心思想证明:要让长度为j的序列全部出现,必须满足第一个数字可以取1..k任意一个,第二个数字可以取1..k任意一个……以此类推当已经划分成j个子序列并无法向后划分的时候,说明第j+1个数是不能在1..k的范围内自由选择的。所以,最短不出现子 阅读全文
posted @ 2011-08-31 15:22
This_poet
阅读(286)
推荐(0)
编辑
摘要:
贪心+ 动态规划。贪心思想:当有一段连续区间[i,j]未交时,取i或j是最优的。贪心思想证明:如果在[i,j]这段连续区间都没有被取的时候取了中间的m,那么后来一定要从m返回到i或者j,这时候是一定走了“冤枉路的”。而如果这时取了i或者j,那么到中间的时候m一定可以取。证毕。动态规划的方程这时候就简单了:f[i,j,0]表示[i+1,j]这一段连续区间都没有取,奶牛站在i上f[i,j,1]表示[i,j-1]这一段连续区间都没有取,奶牛站在j上方程:f[i,k,0]:=Min(Max(f[i-1,k,0]+a[i]-a[i-1],time[i]),Max(f[i,k+1,1]+a[k+1]-a[ 阅读全文
posted @ 2011-08-31 01:00
This_poet
阅读(522)
推荐(1)
编辑
摘要:
比较巧妙的并查集,考察对并查集的引申应用。维护三个数组:a[i]表示i到pre[i]中间有方块的个数pre[i]表示i所在集合编号,即根c[i]表示以i为标志的集合中元素个数,只有当pre[i]=i的时候c[i]才有意义合并时,只需进行如下操作:1、对读入的x、y分别进行路径压缩,直到找到真根为止2、合并x、y两个集合,主要步骤如下: pre[x]:=y;a[x]:=c[y];c[y]:=c[y]+c[x];这道题目倒是和银河英雄传说有些相似之处,可以对比着来做一下。 1 program cubes;//by_poetshy 2 const 3 maxn=30000; 4 var 5 ... 阅读全文
posted @ 2011-08-30 23:14
This_poet
阅读(138)
推荐(0)
编辑
摘要:
维护两个树状数组,一个记录这个坐标所控制的范围内的奶牛个数,另外一个记录这个坐标所控制范围内的奶牛坐标之和。program poj1990;//by_poetshyconst maxn=20000;var i,n :longint; p,m,ans :int64; v,x,a,h :array[1..maxn]of int64; procedure qsort(l,r:longint);var i,j,k,temp:l... 阅读全文
posted @ 2011-08-30 23:12
This_poet
阅读(215)
推荐(0)
编辑
|
|