上一页 1 ··· 4 5 6 7 8
摘要: http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=11975#problem/I一道概率题。还是递推题。用dp[pre][i][j]表示当前有i道正确的题,j道不正确的题。用dp[now][i][j]表示下一个状态有i道正确的题,j道不正确的题。如果当前是w同学,那么他有两种选择。改错一道题,或者不做任何改变。要是改错的话,他只能从对的里面选一道。如果要是不动的话那么他将会从错的题里面选择,而且选择的错的题不能是之前改过的。所以状态如下if(i>0) dp[now][i-1][j+1]+=dp[pr... 阅读全文
posted @ 2012-08-24 01:04 一把刷子 阅读(312) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=11975#problem/D用f【i】【j】表示i号城堡到j号城堡所需要的魔法值。首先要用floyd算出任意两个城市之间到达所需要的最小魔法值。然后用t【i】【j】表示i号城堡从j-1号房间到达j号房间所需要的时间。用dp【k】【i】【j】表示当前魔法值为k到达i号城堡j号房间所需要的最短时间。如果已经知道了dp【k】【i】【j】那么我们就可以推出dp【k】【i】【j+1】,也可以推出dp【temp】【l】【j+1】(其中l是另一个城堡,temp是当期魔法值减去i号城堡到j号城 阅读全文
posted @ 2012-08-23 22:46 一把刷子 阅读(319) 评论(0) 推荐(0) 编辑
摘要: 关于LCA和RMQ问题一、最近公共祖先(Least Common Ancestors)对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。另一种理解方式是把T理解为一个无向无环图,而LCA(T,u,v)即u到v的最短路上深度最小的点。这里给出一个LCA的例子:例一对于T=<V,E>V={1,2,3,4,5}E={(1,2),(1,3),(3,4),(3,5)}则有:LCA(T,5,2)=1LCA(T,3,4)=3LCA(T,4,5)=3 二、RMQ问题(Range Minimum Query)RMQ问题是指:对于长度 阅读全文
posted @ 2012-08-22 19:58 一把刷子 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 网上查了半天不知所云,网上说的太多,俺只是要知道所需要的就可以了。写了个程序试了一下,其实就是这个东西可以根据你所需要的类型就行匹配。其实就是模板比如求最小值,要int,double,char,那么你就 要写三个函数1 int sum(int, int);2 3 float sum(float, float);4 5 double sum(double, double);6 7 但是有了templae<typename T>你就只需要写一个函数。详见代码: 1 #include<iostream> 2 #include<vector> 3 #include& 阅读全文
posted @ 2012-08-22 17:11 一把刷子 阅读(14023) 评论(0) 推荐(3) 编辑
摘要: http://poj.org/problem?id=1330这个是tarjian离线的版本:对于一个父亲的所有孩子。我们都去递归Lca。如果当前点是要询问的那个两个点中的一个而且另外一个已经访问过了。就输出。方法一:Tarjan离线算法 在学习离线算法的时候先需要先巩固一下深度搜索,并查集 Tarjan离线算法是基于深度优先搜索的,我们从根开始向下搜索,搜到一个节点的时候首先判断该节点所有子节点是否访问过,如果都已经访问过,则判断该节点是否询问点里面的其中一个,如果是,则判断跟它相对应的那个点是否已经访问过,如果访问过,则他们的最近公共祖先便是已经访问过的那个节点的当前节点,如果另外一个节点没 阅读全文
posted @ 2012-08-22 15:54 一把刷子 阅读(209) 评论(0) 推荐(0) 编辑
摘要: ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]),其中k=[ln(b-a+1)/ln(2)](即2^k<=b-a+1(长度)) d的求法可以用动态规划,d[i,j]=max(d[i,j-1],d[i+2^(j-1),j-1])来看一下ST算法是怎么实现的(以最大值为例): 首先是预处理,用一个DP解决。设a是要求区间最值的数列,f表示从第 i 个数起连续 2^j 个数中的最大值。例如,数列3 2 4 5 6 8 1 2 9 7 , 阅读全文
posted @ 2012-08-21 21:53 一把刷子 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 树状数组是对一个数组改变某个元素和求和比较实用的数据结构。两中操作都是O(logn)。在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。 但是不难发现,如果我们修改了任意一个A[i],S[i]、S[i+1]...S[n]都会发生变化。 可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需要O(n)的时间。 当n非常大时,程序会运行得非常缓慢。 因此,这里我们引入“树状数组”,它的修改与求和都是O(logn)的,效率非常高。【理论】 为了对树状数组有个形 象的认识,我们先看下面这张图。 如图所示,红色矩形表示的数组C[]就是树状数组。 这里.. 阅读全文
posted @ 2012-08-21 10:52 一把刷子 阅读(122) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8