Scout YYF I(矩阵优化dp)

本文介绍了一种使用矩阵优化方法解决特定概率问题的方法。该问题涉及计算角色在特定地图上安全通过地雷区的概率,角色有p的概率向前移动一格,1-p的概率向前移动两格。文章给出了详细的动态规划解析过程,并展示了如何通过矩阵快速幂进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

我是超链接

题意:

主人公有p的几率走一步,1-p的几率走两步,主人公一开始在格子1,给出地雷的位置,请问安全通过的概率是多少

题解:

概率与期望第一弹,但是这道题体现的基本是矩阵优化思想,那就当是矩阵题做一下

dp[i]表示到第i个格子安全的概率,不难发现:dp[i]=dp[i-1]*p+dp[i-2]*(1-p)

但是这样i太大了,我们不如矩阵优化一下

dp[i]       | p ,1-p  |n-1    dp[1]
             =|            |  *
dp[i-1]    | 1 , 0    |         dp[0]

代码:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
struct hh
{
	double cr[3][3];
};
int a[12];
double p;
hh work(hh a,hh b)
{
	hh c;
	int i,j,k;
	memset(c.cr,0,sizeof(c.cr));
	for (i=1;i<=2;i++)
	  for (j=1;j<=2;j++) 
	    for (k=1;k<=2;k++)
	      c.cr[i][j]=(c.cr[i][j]+a.cr[i][k]*b.cr[k][j]);
	return c;
}
double pow(int pp)
{
	hh x,ans;
	memset(ans.cr,0,sizeof(ans.cr));
	x.cr[1][1]=p; x.cr[1][2]=1-p;
	x.cr[2][1]=1; x.cr[2][2]=0;
	ans.cr[1][1]=1;
	ans.cr[2][1]=0;
	for (;pp;pp>>=1,x=work(x,x))
	  if (pp&1) ans=work(ans,x);
	return ans.cr[1][1];
}
int main()
{
	int n,i;
	while (~scanf("%d%lf",&n,&p))
	{
	  for (i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	  sort(a+1,a+n+1);
	  double rr=1.0;
	  for (i=1;i<=n;i++)
	    rr*=(1-pow(a[i]-a[i-1]-1));
	  printf("%.7f\n",rr);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值