概率/期望dp

news2024/12/28 19:11:13

 思维方式

概率/期望dp都是分析从当前状态能否去到其他情况,然后进行期望/概率公式的运算,最后消元推导出一般式。

​​​​​​Problem - 4089 (hdu.edu.cn)

思路:概率dp,正推

  1. 分类讨论,设dp[i][j]表示i人的队伍在第j个位置时事件发生的期望
    1. 首先,我们清楚,如果在dp[i][j]发生事件1,到达的状态还是dp[i][j],情况不变,所以可以把该情况移到左式再等式同除1-p1
    2. j=1,有dp[i][1]=\frac{p2*dp[i][i]+p4}{1-p1},我们如果发生事件2,你们就会到达i人队伍并排在最后的情况的期望,如果事件4,因为在k内,直接计入贡献
    3. 1<j<=k,有dp[i][j]=\frac{p2*dp[i][j-1]+p3*dp[i-1][j-1]+p4}{1-p1},发生事件2,我们到达i人队伍前进一维的状态,事件3队伍-1人,我们也是进一位,事件4在k内直接计入贡献
    4. j>k,有dp[i][j]=\frac{p2*dp[i][j-1]+p3*dp[i-1][j-1]}{1-p1},就是少了个事件4的贡献而已。
  2. 我们现在只有推导时求dp[i][1]时,dp[i][i]未知,这个是好解决的。dp[i][1]到dp[i][i]一共有i条式子,i个变量,我们可以全部联立即可消元得到dp[i][i],对于dp[i][j],我们可以看成是dp[i][j]=p*dp[i][j-1]+tmp,最后消元得到dp[i][i]就是dp[i][i]=p^{i}*dp[i][i]+tmp'观察到p就是p2/(1-p1)
  3. 我们注意到有除法1-p1与1-p1-p2,显然,不能除0,所以特判他们为0直接结束。
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
const int N = 2e3 + 10;
double dp[N][N];
void mysolve()
{
	int n,m,k;
	double p1,p2,p3,p4;
	while(cin>>n>>m>>k>>p1>>p2>>p3>>p4)
		{
			if(1-fabs(p1+p2)<1e-6)//特判
				{
					cout<<"0.00000"<<endl;
					continue;
				}
			dp[1][1]=p4/(1-p1-p2);
			double p21=p2/(1-p1),p31=p3/(1-p1),p41=p4/(1-p1);//简化公式
			for(int i=2; i<=n; ++i)
				{
					double p=p21,tmp=p41;
					for(int j=2; j<=i; ++j)
						{
							p*=p21,tmp=tmp*p21+p31*dp[i-1][j-1];
							if(j<=k)tmp+=p41;//累加获得p'与tmp'
						}
					dp[i][i]=tmp/(1-p);//得到p[i][i]
					dp[i][1]=p21*dp[i][i]+p41;//获得p[i][1]
					for(int j=2; j<i; ++j)//可以正推了
						{
							dp[i][j]=p21*dp[i][j-1]+p31*dp[i-1][j-1];
							if(j<=k)dp[i][j]+=p41;
						}
				}
			printf("%.5lf\n",dp[n][m]);
		}
}

int32_t main()
{
	mysolve();
	return 0;
}

Problem - 4035 (hdu.edu.cn)

思路:树上期望

  1. ,分类讨论节点可能进入的状态,设p1为被杀概率,p2为逃生概率,cnt为该节点连接的其它点的数量。
    1. 有(1-p1-p2)的概率去往其他节点,去每个点的概率都是1/cnt
    2. 有p2概率逃生,得到期望p2*0=0。
    3. 有p1的概率被杀,回到点1,得到期望p1*dp[1]。  
  2. 显然,最后dp公式可以写成dp[i]=xdp[1]+ydp[父]+k(k为常数)。看似有2个未知量,但是每次ydp[父]转移到父代后就成为常数,而最终的dp[1]=x'dp[1]+0+k(没有父亲),所以dp[1]=k/(1-x')
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
const int N = 1e4 + 10;
double f1[N],f2[N],f3[N];
vector<int>edge[N];
double p1[N],p2[N];

void dfs(int u,int f)
{
	double cnt=0.0,son=0.0;//都设置为浮点数,cnt为整形会wa
	if(u!=1)cnt++;//加一个父节点
	for(auto v:edge[u])if(v!=f)
			{
				dfs(v,u);
				f1[u]+=f1[v],son+=f2[v],f3[u]+=f3[v];//继承子代们的各项系数
				cnt++;
			}
	double y=1-p1[u]-p2[u],p=1.0;
	if(cnt>0.0)p=1-y*son/cnt;
	f1[u]=(y*f1[u]/cnt+p1[u])/p;
	if(cnt>0.0)f2[u]=y/cnt/p;
	f3[u]=y*(f3[u]/cnt+1)/p;
}
int tt=0;
void mysolve()
{
	int n,x,y;
	cin>>n;
	for(int i=1; i<=n; ++i)edge[i].clear(),f1[i]=f2[i]=f3[i]=0.0;//期望涉及前后关系,每次都要记得初始化
	for(int i=1; i<n; ++i)scanf("%d %d",&x,&y),edge[x].push_back(y),edge[y].push_back(x);
	for(int i=1; i<=n; ++i)scanf("%lf %lf",&p1[i],&p2[i]),p1[i]/=100.0,p2[i]/=100.0;
	dfs(1,0);
	cout<<"Case "<<++tt<<": ";
	if(fabs(f1[1]-1.0)<1e-9)
		{
			cout<<"impossible"<<endl;
		}
	else
		{
			double ans=f3[1]/(1-f1[1]);
			printf("%.6lf\n",ans);
		}
}

int32_t main()
{
	ll t=1;
	cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - 6656 (hdu.edu.cn)

思路:期望dp,正推

  1. 首先,显然的是,去x点之前,必须经过x-1点,所以,我们求l到r,可以等于dp[r]-dp[l](dp[i]表示从1级升到i级需要的期望)
  2. 显然,我们可以从低级推到高级,当前dp[i]已知,求dp[i+1],那么dp[i+1]=a[i]+dp[i]+(1-p)*(dp[i+1]-dp[x[i]]),即dp[i+1]=\frac{a[i]+dp[i]}{p[i]}+(1-\frac{1}{p[i]})*dp[x[i]]分析一下,我们去dp[i+1],无论成功与否,都需到达dp[i]的期望+升级一次的代价,加上还有(1-pi)的概率会去dp[xi],那么从xi到i+1,需要的期望就是dp[i+1]-dp[xi],所以有(1-pi)的概率额外增加消耗dp[x+1]-dp[xi]
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
//double 型memset最大127,最小128
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 5e5 + 10;
const int mod=1e9+7;
int dp[N];
int r[N],s[N],x[N],a[N];

ll fastmi(ll base,ll power)
{
	ll ans=1;
	while(power)
		{
			if(power&1)ans=ans*base%mod;
			power>>=1,base=base*base%mod;
		}
	return ans;
}
void mysolve()
{
	int n,q;
	cin>>n>>q;
	for(int i=1; i<=n; ++i)cin>>r[i]>>s[i]>>x[i]>>a[i];
	dp[1]=0;
	for(int i=1; i<=n; ++i)
		{
			int p1=s[i]*fastmi(r[i],mod-2)%mod;//p1是1/pi
			dp[i+1]=((a[i]+dp[i])*p1%mod+(1-p1+mod)%mod*dp[x[i]]%mod)%mod;
		}
	int x,y;
	while(q--)
		{
			cin>>x>>y;
			cout<<(dp[y]-dp[x]+mod)%mod<<endl;
		}
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t=1;
	cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - 1145 (hdu.edu.cn)

思路:期望dp,倒推

  1. 我们设dp[i]为考虑了前面n-i题的情况下的答题期望。
  2. 假设当前答对了i道题,那么他答不答i+1道,取决于答完是否期望会比答对i道的奖金高(2^i),那么他需要知道答对i+1道的期望,如果pi*dp[i+1]>=2^i,那么答题。
  3. 因此,我们每次求i,都是需要知道后面的答题期望才可确认是否答题,倒推即可。
  4. 显然,dp[n]=2^n,因为它后面没有题需要考虑,答对n道就是n道的奖金
  5. 因为给定p是答对概率在(p,1)波动,所以,如果p<pi时,我们显然不要答题,保留得到i道题的奖金(2^i),否则答题,得到pi*dp[i+1]的奖金
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
#define endll            endl<<endl
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
//double 型memset最大127,最小128
const int INF = 0x3f3f3f3f;         //int型的INF
const ll llINF = 0x3f3f3f3f3f3f3f3f;//ll型的llINF
const int N = 35;
double dp[N];
int pre[N];
void mysolve()
{
	int n;
	double p;
	pre[0]=1;
	for(int i=1; i<=30; ++i)pre[i]=2*pre[i-1];
	while(cin>>n>>p&&(n||fabs(p)>1e-9))
		{
			dp[n]=pre[n];
			for(int i=n-1; i>=0; --i)
				{
					double tmp=pre[i]/dp[i+1];//答题与否的分界线
					if(p>=tmp)//大于就答题
						{
							dp[i]=(p+1)/2*dp[i+1];//因为是p~1的平均期望,取中间值
						}
					else
						{
							dp[i]=(tmp-p)/(1-p)*pre[i]+(1-tmp)/(1-p)*(tmp+1)/2*dp[i+1];//在p<tmp的情况下不答,发生概率是(tmp-p)/(1-p),剩下就是答题
						}
				}
			printf("%.3lf\n",dp[0]);
		}
}

int32_t main()
{
	//std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t=1;
	//cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣sql中等篇练习(八)

力扣sql中等篇练习(八) 1 确认率 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 分别统计没确认的用户和已经确认了的用户 SELECT s.user_id,ROUND(SUM(IF(c.actionconfirmed,1,0))/count(*),2) co…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例应用

如今&#xff0c;Earth Engine凭借其强大的功能正受到越来越多国内外科技工作者的关注&#xff0c;应用范围也在不断扩大。学习致力于帮助科研工作者掌握Earth Engine的实际应用能力&#xff0c;以Python编程语言为基础&#xff0c;结合实例讲解平台搭建、影像数据分析、经典应…

JAVA开发(H5商城嵌套到第三方H5商城进行异业合作方案)

需求背景&#xff1a; 很多电商网站或者说是购物网站都是H5商城的方式&#xff0c;每个公司都有自己的H5商城。当公司和公司之间进行异业合作&#xff0c;商城互相导流甚至商城聚合时就需要H5商城和H5商城的嵌套和对接。假如存在A商城和B商城&#xff0c;现在需要B商城入驻到A商…

CrackMapExec 域渗透工具使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、CrackMapExec 是什么&#xff1f;二、简单使用1、获取帮助信息2、smb连接执行命令3、使用winrm执行命令&#xff08;躲避杀软&#xff09;4、smb 协议常用枚…

Binder 驱动结构体列表

下面列举 Binder 驱动相关的一些重要结构体 6~9 用于数据传输相关&#xff0c;其中 binder_write_read&#xff0c;binder_transaction_data进程空间和内核空间是通用的。 BWR 核心数据图表 binder_write_read 是整个 Binder IPC 过程&#xff0c;最为核心的数据结构之一 3.…

品牌推广:如何让品牌在市场中保持活力并吸引更多的年轻人?

在如今这个竞争激烈的市场环境中&#xff0c;让品牌年轻化已经成为了许多企业追求的目标。随着社会的不断发展和进步&#xff0c;消费者的需求和心理也在不断变化。因此&#xff0c;如果一个品牌想要在市场中保持活力并吸引更多的年轻人&#xff0c;就必须思考如何让品牌年轻化…

【社区图书馆】读书推荐:《PyTorch高级机器学习实战》

读书推荐&#xff1a;《PyTorch高级机器学习实战》 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏…

【GIT】git push后长时间没反应

方向一 查看是否添加ssh 打开git bash cd ~/.ssh看是否成功&#xff0c;能成功说明之前生成过&#xff0c;看文件夹下是否有id_rsa.pub和id_rsa文件&#xff0c;有的话跳过生成步骤3 输入 ssh-keygen -t rsa -C ‘your_emailexample.com’(注&#xff1a;your_emailexample.c…

人人都能GPT!微软开源DeepSpeed Chat帮用户训练模型

简介 4月12日&#xff0c;微软宣布开源了 DeepSpeed Chat&#xff0c;帮助用户加速训练类似于 ChatGPT 的模型。 DeepSpeed Chat 能够简化 ChatGPT 类型模型的训练过程、强化推理体验。其中的 DeepSpeed-RLHF 系统能够在推理和训练两种模式之间进行切换&#xff0c;使复杂的 …

【经典面试题目:最长递增子序列变形题目 | 动态规划 + 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

StackExchange.Redis.RedisServerException 针对持有错误类型值的密钥的WRONGTYPE操作

Redis 的异常消息&#xff1a;StackExchange.Redis.RedisServerException:“WRONGTYPE Operation against a key holding the wrong kind of value” 最近一个较早的项目新增一些功能&#xff0c;业务中服务端需要在token中自动获取用户相关信息的操作&#xff0c;项目中已经封…

web模块_2(SQL注入,上传文件的权限获取)

1题目描述&#xff1a;你知道index.php的备份文件名吗&#xff1f; index.php的备份文件名为index.php.bak2题目描述 php中&#xff0c;双等号是弱类型比较。判断是否相等&#xff0c;不判断格式。 判断格式是否相等。“0a”0为True&#xff0c;“1235a"不算数字&#xf…

从原理聊JVM(一):染色标记和垃圾回收算法

作者&#xff1a;京东科技 康志兴 1 JVM运行时内存划分 1.1 运行时数据区域 • 方法区 属于共享内存区域&#xff0c;存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池&#xff0c;属于方法区的一部分&#xff0c;用于存放编译期生…

spring的BeanFactory和applicationContext有什么区别?

一、加载bean时机不同 ApplicationContext是一次性立刻加载,比较消耗资源但是后续读取非常快,会将spring中所有的bean进行初始化,全部实例化到spring中!!属于饿汉模式加载。 Beanfactory是一个用来管理bean对象的工厂&#xff0c;加载bean的时候不会立刻一次性加载,使用的是惰性…

【C语言】分支语句和循环语句(下)

【C语言】分支语句和循环语句&#xff08;下&#xff09; 1.for循环1.2 语法1.3 break和continue在for循环中1.4 for语句的循环控制变量1.5 一些for循环的变种1.6一道笔试题 2. do……while&#xff08;&#xff09;循环2.1 do语句的语法2.2 do语句的特点2.3 do while循环中的b…

Python多线程慎用shutil.make_archive打包

Python多线程慎用shutil.make_archive打包 记一下在工作中遇到一个错误&#xff0c;先说一下结论shutil.make_archive是线程不安全的&#xff0c;要慎重使用&#xff01;&#xff01;&#xff01; 参考&#xff1a;https://stackoverflow.com/questions/41625702/is-shutil-mak…

【C++】从C语言入门C++的基础知识

C基础知识 前言1. C关键字2. 命名空间namespace命名空间的创建命名空间的使用命名空间的注意事项 3. C输入&输出4. 缺省参数概念分类全缺省参数半缺省参数 5. 函数重载概念实现C为什么能进行函数重载C和C的相互调用&#xff08;可以不用看&#xff09; 6. 引用概念注意事项…

相参积累

原理 在探测远距离目标时&#xff0c;由于目标回波信号比较微弱&#xff0c;信号幅度很小&#xff0c;从而导致接收信号的信噪比&#xff08;SNR&#xff09;过低&#xff0c;以至于信号处理算法检测不到目标&#xff0c;从而发生漏检。 在脉冲体制雷达中&#xff0c;雷达系统…

Oracle创建物化视图

Oracle创建物化视图 物化视图的语法物化视图的创建关于手动刷新创建手动刷新的物化视图 查看物化视图删除物化视图 物化视图的语法 物化视图的创建语法&#xff0c;如下所示&#xff1a; create materialized view [view_name] [ build immediate | build deferred ] [ refre…

LRU算法和LFU算法

LRU&#xff08;Least Recently Used&#xff09;最近最少使用&#xff0c;淘汰最近最少使用的数据&#xff0c; LFU&#xff08;Least Frequently Used&#xff09;最近最不频繁用&#xff0c;淘汰最不常用的数据。 LRU算法 传统的LRU基于链表实现。基本的一个LRU算法实现就…