随笔分类 - ACM_DP
摘要:题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:有n个盒子,每个盒子里面放了一个奖品,m个人轮流去选择盒子,如果盒子里面有奖品,就把奖品拿走,盒子留下,否则直接走人。求最后被抽走的奖品数期望。。。 如果直接考虑用期望来建立DP,复杂度都很高,而且题目精度过高。换一个角度思考,考虑每个奖品不被拿走的概率(1/n)^m,那么不被拿走的期望就是n*(1/n)^m,则拿走的期望n-n*(1/n)^m,复杂度O(1)。还可以考虑f[i]表示第 i 个人拿到奖品的概率,那么1-f[i]就是没有拿到奖品的概率,是对立事件,则f[
阅读全文
摘要:题目链接:http://poj.org/problem?id=3071 题意:有2^n只足球队打比赛,编号1和2,3和4等进行淘汰制,胜利的进入下一轮接着淘汰,求最后哪支球队赢的概率最大。 简单题概率DP,画一颗树就知道方程了,f[i][j]表示第 i 轮第 j 只球队获胜的概率,则f[i][j]=Σ( f[i-1][k] ),k为第 j 只球队能遇见的所有球队。 1 //STATUS:C++_AC_94MS_320KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2262 题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到canteen哪里,求期望。 这个是带环的求期望问题,并且没有什么特殊性,只有列出方程,然后gauss消元了。首先用BFS求出能走的点,并判断能否走到canteen。然后列出期望方程,E[i]=Σ( E[j]*p[j] ) +1。然后好求了,注意题目中有多个canteen。。。 1 //STATUS:C++_AC_437MS_700KB 2 #include 3 #include 4 #...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4418 题意:简单来说就是给你1个环(n - 1 , n - 2 …… 0 ,1 , 2 , 3 …… n - 2)。你可以走1 - m步每步的概率是给定的。。保证sum(pk)(1 n - 1 ,d = 1代表从n - 1 -> 0。 由于这里同一个点每次转移的方向是不一样的,因此要进行拆点,即0, 1, 2, 3 -> 0, 1, 2, 3, 4, 5,4和5分别表示2和1这个点的相反的方向。然后做一遍BFS,看是否能到达Y点,如果能的话,列出期望方程:E[i]=Σ( (E[j]+k
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4661 题意:有n个人呈树状结构,每个人知道一个独特的消息。每次可以让一个人将他所知的所有消息告诉和他相邻的人。求所有人都知道所有消息花时花的步数最少的所有方案数。 首先需要满足的是最小的步数,所以我们一定是先把所有消息先传到一个人手中才是最优的,然后再从这个人传回去,也就是每条边走两次。我们只需要考虑单向传到某个人的方案数cnt,因为再传回去也是cnt。那么我们可以枚举每个点为收集点,把所有的和加起来就是答案。这里就是一个树形DP的问题,转移的时候是一个组合问题:记录f[u],cnt[u]...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4655 先不考虑相临的有影响,那么总数就是n*prod(ai),然后减去每个相邻的对总数的贡献Σ( Min(a[i],a[i+1])*prod(i-1)*prod(i+2) ),其中prod(i)为[1,i-1]这个区间a[i]的积,prod(i+2)表示的是[i+2,n]这个区间,答案就是n*prod(ai)-Σ( Min(a[i],a[i+1])*prod(i-1)*prod(i+2) ),可以得到取得最大值是ai的排列就是最小,最大,次小,次大,例如:1 2 3 4 -> 1 4 2 3
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4089 开始方程想错T^T,题解见下面。。。 dp[i][j]表示队列中有i个人,Tomato排在第j个,能发生所求事件的概率。 显然,dp[n][m]即为所求。 j == 1 : dp[i][1] = p1*dp[i][1] + p2*dp[i][i] + p4; 2 k : dp[i][j] = p1*dp[i][j] + p2*dp[i][j-1] + p3*dp[i-1][j-1]; 化简: j == 1 : dp[i][1] = p*dp[i][i] + ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意:买食品收集n个卡片,每个卡片的概率分别是pi,且Σp[i] Σp[i]*f[s]=Σp[i]*f[s|(1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 简单概率DP,转移方程:f[i][j]=f[i][j]*p1+f[i][j+1]*p2+f[i+1][j]*p3+2 —> f[i][j]=(f[i][j+1]*p2+f[i+1][j]*p3+2)/(1-p1). 1 //STATUS:C++_AC_2828MS_32180KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4649 题意:给一个位运算的表达式,每个运算符和其后的运算数有一定概率不计算,求最后表达式的期望。 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就得到了总体的期望。 对于每一位,状态转移方程如下: f[i][j]表示该位取前i个数,运算得到j(0或1)的概率是多少。 f[i][1]=f[i-1][1]*p[i]+根据不同运算符和第i位的值运算得到1的概率。 f[i][0]同理。 1...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 很不错的概率DP题目,因为这题是无向图,所以要对叶节点和非叶节点考虑,然后列出方程后,因为数据很大,高斯消元如果不特定优化会超时,可以转化方程,然后求解系数。解法: 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求:走出迷宫所要走的边数的期望...
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3593 带环的概率DP一般的做法是求出转移方程,然后高斯消元解方程。但是这里的环比较特殊,都是指向f[0]。 此题的转移方程为:f[i]=Σ(f[i+k]*p[k])+f[0]*p[0]+1. 我们可以设 f[i]=A[i]*f[0]+B[i].带入右边有: f[i]=Σ(A[i+k]*f[0]*p[k]+B[i+k]*p[k])+f[0]*p[0]+1. -> f[i]=Σ(A[i+k]*p[k...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3744 简单的概率DP,分段处理,遇到mine特殊处理。f[i]=f[i-1]*p+f[i-2]*(1-p),i!=w+1,w为mine点。这个概率显然是收敛的,可以转化为(f[i]-f[i-1])/(f[i-1]-f[i-2])=p-1。题目要求精度为1e-7,在分段求的时候我们完全可以控制进度,精度超出了1e-7就不运算下去了。当然此题还可以用矩阵乘法来优化。 考虑概率收敛代码: 1 //STATUS:C++_AC_0MS_164KB 2 #include 3 #include 4 #include 5 //#i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 数据不大,枚举本质。首先对枚举出回文串,然后用DP或者搜索,这里因为层数不多,用bfs比较好,或者用IDA*。。。 1 //STATUS:C++_AC_140MS_780KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4639 简单递推题,呵呵,不多说。。。 1 //STATUS:C++_AC_15MS_272KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 区间DP,f[i][j]表示[i,j]区间回文字串的个数。f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+s[i]==s[j]?f[i-1]+f[j-1]+1:0 。 1 //STATUS:C++_AC_281MS_4188KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 比较典型的树形DP题目,f[u][j][k]表示以点u为子树,经过 j 个陷阱的最大值,其中k=0表示从u点出发,k=1表示终点为点u。则转移方程为:f[u][j+is_rtap][k]=Max{ f[v][j][k] | v为u的儿子节点,0 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 因为deque最后的数列是单调不降的,因此,我们可以枚举数列中的某个中间数Ai,如果从中间数Ai开始,如果后面的要和这个中间数形成单调不降的序列,那么后面的数必须是单调不降或者单调不升的序列,才能进入deque中,因此为两者长度的和,这就是一个LIS的DP。然后枚举的时候从后往前枚举,复杂度O( n*log n)。这里要注意一点,存在相同元素,因此需要减去两个里面出现Ai次数的最小值! 1 //STATUS:C++_AC_281MS_3768KB 2 #include 3 #i...
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3725 n个点排列,给每个点着色,求其中至少有m个红色的点连续的数目。f[i]表示前i个点至少有m个连续红色的个数,则f[i]=f[i-1]*2+2^(i-m-1)-f[i-m-1]。 1 //STATUS:C++_AC_120MS_1784KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #inclu...
阅读全文
摘要:题目链接:http://poj.org/problem?id=2096 f[i][j]表示从当前状态到目标状态的期望。。。 1 //STATUS:C++_AC_188MS_8076KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include...
阅读全文