首页 > 其他分享 >KPGAME - A game with probability(概率dp,博弈)

KPGAME - A game with probability(概率dp,博弈)

时间:2022-10-31 08:35:45浏览次数:54  
标签:概率 probability text oplus1 石子 KPGAME times game dp

先考虑一下如果我想赢得游戏,我会采取的最优策略是什么。

首先,想赢得游戏就是要取到最后一个石子,每次抛硬币相当于给你一次机会,每次机会都有相同概率取到石子,显然,最优策略就是让我最后一次取石子的机会越多。

如何让机会最多?当然是取最后一个石子时,我先抛硬币,这样我的机会就越多。也就是说,我不想取倒数第二个石子。因为如果是我取了倒数第二个石子的话,取最后一个石子时先抛硬币的就是对手了。

那么就可以考虑 dp 了:设 \(dp(i,j=0/1,k=0/1)\) 表示 Alice 和 Bob 都 想(\(k=0\))/不想(\(k=1\)) 取到第 \(i\) 个石子,最后 Alice(\(j=1\))/Bob(\(j=2\)) 实现愿望的概率。(实现愿望就是指“取到(\(k=0\))/没取到(\(k=1\)) 第 \(i\) 个石子”)。

接下来以 \(dp(i,j,0)\) 的转移为例:表示两个人都想要取到第 \(i\) 个石子,最后 \(j\)(代表 Alice 或 Bob)取到的概率。

显然,两个人的最优策略都是他们都想先抛第 \(i\) 个石子的硬币。意思就是说他们都不想取第 \(i-1\) 个石子。

  1. 假设 \(j\) 成功地没取到第 \(i-1\) 个石子,那么有:(其中设 \(p[0]=p\),\(p[1]=q\))

    \[\begin{aligned}dp(i,j,0)=&dp(i-1,j,1)\times p_j \times\\&\{1+\underbrace{(1-p_j)(1-p_{j\oplus1})}_{\text{第一轮两人都没扔到正面的概率}}+\underbrace{[(1-p_j)(1-p_{j\oplus1})]^2}_{\text{前两轮两人都没扔到正面的概率}}+\underbrace{[(1-p_j)(1-p_{j\oplus1})]^3}_{\text{前三轮两人都没扔到正面的概率}}+\dots\}\end{aligned} \]

    最后面那个括号里的东西有点复杂,考虑化简:

    令 \(t_0=(1-p_j)(1-p_{j\oplus1})\),令

    \[\begin{aligned}S_0&=\lim_{k\rightarrow \infty}1+t_0+t_0^2+\dots+t_0^k\\S_0t_0&=\lim_{k\rightarrow \infty}t_0+t_0^2+\dots+t_0^{k+1}\end{aligned} \]

    上式减下式得:

    \[\begin{aligned}S_0(1-t_0)&=\lim_{k\rightarrow \infty}1-t_0^{k+1}\\S_0&=\frac{\lim_{k\rightarrow \infty}1-t_0^{k+1}}{1-t_0}\\&=\frac{1-0}{1-t_0}(0<t_0<1\text{ 得}\lim_{k\rightarrow \infty}t_0^{k+1}=0)\\&=\frac{1}{1-t_0}\end{aligned} \]

    那么就有:\(dp(i,j,0)=dp(i-1,j,1)\times p_j\times S_0\)。

  2. 假设 \(j\) 没能成功地不取第 \(i-1\) 个石子,也就是说他不幸地取到了第 \(i-1\) 个石子,那么必须得先让对手取一次,再轮流取,即:

    \[dp(i,j,0)=\underbrace{[1-dp(i-1,j,1)]}_{\text{上次没成功的概率}}\times \underbrace{(1-p_{j\oplus1})}_{\text{对手第一次抛硬币没扔到正面的概率}}\times\underbrace{p_j\times S_0}_{\text{接下来轮流抛,$j$ 抛到正面的概率}} \]

综述,可以推出:

\[dp(i,j,0)=dp(i-1,j,1)\times p_j\times S_0+[1-dp(i-1,j,1)]\times(1-p_{j\oplus1})\times p_j\times S_0 \]

自己按上面的方法推一下,同理可得:

\(dp(i,j,1)=dp(i-1,j,0)\times (1-p_{j\oplus 1})\times S_1+[1-dp(i-1,j,0)]\times p_j\times (1-p_{j\oplus 1})\times S_1\)

(其中 \(S_1=\frac{1}{1-t_1}\),\(t_1=p_j\times p_{j\oplus1}\))

按这种方法 dp(要滚动一下),发现时间复杂度是 \(O(n)\) 的,过不去。

猜测用矩阵快速幂加速或者有收敛,手测了几组大数据之后发现有收敛,于是就过了。(当然用矩阵快速幂应该也可以)

代码如下:

#include<bits/stdc++.h>

using namespace std;

int t,n;
double p[2],dp[2][2][2];

int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%lf%lf",&n,&p[0],&p[1]);
		n=min(n,1000);//收敛
		double s[2];
		s[0]=(1-(1-p[0])*(1-p[1]));
		s[1]=(1-p[0]*p[1]);
		memset(dp,0,sizeof(dp));
		dp[0][0][1]=dp[0][1][0]=1;
		int now=1;//滚动数组(其实收敛之后不用滚动都可以)
		for(int i=1;i<=n;i++,now^=1)
		{
			for(int j=0;j<2;j++)
			{
				dp[now][j][0]=dp[now^1][j][1]*p[j]/s[0]+(1-dp[now^1][j][1])*(1-p[j^1])*p[j]/s[0];
				dp[now][j][1]=dp[now^1][j][0]*(1-p[j^1])/s[1]+(1-dp[now^1][j][0])*p[j]*(1-p[j^1])/s[1];
			}
		}
		printf("%lf\n",dp[now^1][0][0]);
	}
	return 0;
}

标签:概率,probability,text,oplus1,石子,KPGAME,times,game,dp
From: https://www.cnblogs.com/ez-lcw/p/16843027.html

相关文章

  • 55.jump-game 跳跃游戏
    问题描述55.跳跃游戏解题思路从后向前遍历,只要nums[j]能由nums[j-1]或者更前面的点跳到,那么终点就从nums[j]变成nums[j-1]或更前面的点。代码#include<vector>u......
  • 45.jump-game-ii 跳跃游戏II
    问题描述45.跳跃游戏II解题思路外循环还是从末尾向前遍历,内循环从前往后遍历,每次找能到达终点的索引最小的位置,该位置作为新的终点,同时步数cnt++。代码#include<vect......
  • 【XSY3338】game(期望,点分治,FFT)
    题面game题解首先可以看出“等概率选连通块->连通块内等概率选点”相当于“全局等概率选点”。一开始感觉无从下手,但是题目中还是给了一点提示。题目让我们输出答......
  • GameObject 游戏物体
    游戏物体查找定义公共变量,将要查找的游戏物体拖入GameObject.Find("要查找的游戏物体名称");通过游戏物体名称查找GameObject.FindGameObjectWithTag("游戏物体的标签......
  • 网狐荣耀版游戏服务器出现 MDM_GF_GAME 游戏命令返回 false
     代码已提交:https://pan.baidu.com/s/1kKR-vieIzkagcjmYcG75KQ 提取码:4dxt 这个问题是因为游戏服务端的命令定义和客户端不一致,一般发生在移动端lua脚本里的命令和......
  • LeetCode_Array_55. Jump Game (C++)
    目录​​1,题目描述​​​​2,解题思路​​​​3,代码【C++】​​​​4,运行结果​​1,题目描述Givenanarrayofnon-negativeintegers,youareinitiallypositionedatthe......
  • 博弈论 Game Theory
    GameTheory概述等边际原理:最优的资源配置必须资源在每种用途上的边际贡献都需相等羊群效应:大家做什么,自己也跟着做什么,不管对错社会的基本问题:协调问题、合作问题协调......
  • Natural Number Game
    因为用Verilog会有颜色显示,所以用的Verilog。记录一下NaturalNumberGame的答案,好久以前做的,但没做完。目录TutorialworldAdditionworldMultiplicationworldFun......
  • D - Div Game -- ATCODER
    D-DivGamehttps://atcoder.jp/contests/abc169/tasks/abc169_d参考:https://blog.csdn.net/justidle/article/details/106474626 思路计算n中所有质数的幂,No......
  • CF1523F Favorite Game
    CF1523FFavoriteGame给定\(n\)个传送门和\(m\)个地点。传送门需要提前前往才能打开,你可以不用任何时间传送到任何一个传送门,你可以步行\(1\)个单位\(1\)秒。每......