首页 > 其他分享 >P4316 绿豆蛙的归宿(期望dp)

P4316 绿豆蛙的归宿(期望dp)

时间:2023-04-27 17:26:09浏览次数:36  
标签:cnt 终点 int 绿豆蛙 P4316 include dp

题目描述

给出张 n 个点 m 条边的有向无环图,起点为 11,终点为 n,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。

绿豆蛙从起点出发,走向终点。 到达每一个顶点时,如果该节点有 k 条出边,绿豆蛙可以选择任意一条边离开该点,并且走向每条边的概率为 1/k。现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?

错误点

  1. 题目给出的是有向边但是按无向边做处理;
  2. 直接遍历每种情况导致TL

思路

1.dfs找出每条可能的路径,在抵达终点后按照其概率赋值给终点(TL)
2.先由有向无环图推出解法大概会与拓扑排序有关,再结合期望dp的解法,可倒序求出每个位置的点到终点的期望长度,这里注意转移方程的写法:dp[u] += (dp[v] + w[u][v]) / cnt;(cnt表示由u到v的边数)

代码:

#include <iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<set>
#include<queue>
using namespace std;
struct P {
	int to, v;
	P(int to, int v) :to(to), v(v) {}
};
vector<P>a[100005];
int n, cnt[100005],in[100005]; 
double dp[100005];
int main(void) {
	int m; cin >> n >> m; 
	while (m--) {
		int u, v, w;
		//倒序输入
		cin >> v >> u >> w;
		//单向边
		a[u].push_back(P(v, w));
		//v可往下走的边数
		cnt[v]++;
		in[v]++;
	}
	priority_queue<int>q; q.push(n); 
	//拓扑排序
	while (!q.empty()) {
		int x = q.top(); q.pop();
		for (int i = 0; i < a[x].size(); i++) {
		    int w = a[x][i].to;
			in[w]--; 
			//向上递推
			dp[w] += (dp[x] + a[x][i].v) / cnt[w];
			if (in[w] == 0) q.push(w); 
		}
	}
	printf_s("%.2lf\n", dp[1]);
	return 0;
}

标签:cnt,终点,int,绿豆蛙,P4316,include,dp
From: https://www.cnblogs.com/markun0/p/17359478.html

相关文章

  • CF960F Pathwalks | 线段树优化DP
    题目设\(dp[x,w]\)为以结点\(x\)为结尾,且最后一条边边权为\(w\)的最长路径长度。考虑根据顺序加边,对于边\((u,v)\),更新\[dp[v,w]=\max_{w'<w}\{dp[u,w']\}+1\]对于每个节点,建一棵线段树,维护\(dp[x]\),这样每次更新\(dp[v,w]\)就相当于在\(dp[u]\)所对应的线段树中查询\([......
  • DP 概论
    对于一个题目,我们有暴力搜索算法。而dp就是尽可能将同一类的东西合并到一个状态上。如何检查dp的正确性?检查集合内部转移是否一致。检查方案数是否正确。状压dp有好几种状态压缩的方式:记录“选了哪些东西”这样的信息,可以用一个长度为\(n\)的01串,对应一个十进制......
  • 【DP】LeetCode 740. 删除并获得点数
    题目链接740.删除并获得点数思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(......
  • C# 获取系统DPI缩放比例以及分辨率大小
    一般方法System.Windows.Forms.Screen类//获取当前主屏幕分辨率intscreenWidth=Screen.PrimaryScreen.Bounds.Width;intscreenHeight=Screen.PrimaryScreen.Bounds.Height;//获取指定屏幕分辨率ScreensecondaryScreen=Screen.AllScreens[1];intsecondaryScree......
  • 区间dp
    区间dp前情提要先赞后看,必成习惯一、区间dp-常见的也常考的dp1.区间dp是什么?区间动态规划是用dp的状态来表示和一段区间有关的性质,比如说dp[i][j]表示解决区间[i,j]上的子问题的最小代价或最大收益,然后利用区间子问题之间的关系递推求解。2.区间dp怎么写?区间dp常见的有......
  • LengthFieldPrepender和LengthFieldBasedFrameDecoder
    1,使用LengthFieldPrepender编码,LengthFieldBasedFrameDecoder解码的netty传输......
  • 【DP】LeetCode 213. 打家劫舍 II
    题目链接213.打家劫舍II思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即n......
  • 本地图文直接复制到WordPress编辑器中
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘贴的原理,通过TheViper找到粘贴图片的方法。其原理为一下步骤:监听粘贴事件;【用于插入图片】获取光标位置;【......
  • 黑客利用WordPress 插件暗中建立后门网站
    东方联盟网络安全组织在上周发布的一份报告中透露,有人观察到威胁行为者利用一个合法但过时的WordPress插件暗中建立后门网站,作为正在进行的活动的一部分。有问题的插件是EvalPHP,由名为flashpixx的开发人员发布。它允许用户插入PHP代码页和WordPress网站的帖子,每次在网......
  • modprobe和insmod的区别
    在Linux中,modprobe和insmod都可以用来加载module,不过现在一般都推荐使用modprobe而不是insmod了。modprobe和insmod的区别是什么呢?1.modprobe可以解决loadmodule时的依赖关系,比如loadmoudleA就必须先loadmouduleB之类的,它是通过/lib/modules/<kernel-version>/modules.dep文......