lightoj1265 Island of Survival(思维或dp)
首 先 说 一 下 非 概 率 d p 的 解 法 \color{Red}首先说一下非概率dp的解法 首先说一下非概率dp的解法
说实话我看到就觉得自己傻X了
鹿这个物种是没啥用的,既不会影响老虎的数量也不会影响人的数量
而我们最后是否存活只和是否有老虎相关
所以有多少鹿是无所谓的!!只有老虎和老虎的相遇有意义!!
所以相当于 t t t只老虎和 1 1 1个人
当 t t t为奇数概率为零,否则是 1 t + 1 \frac{1}{t+1} t+11的概率赢
就是就是 t t + 1 ∗ t − 1 t ∗ t − 2 t − 1 . . . ∗ 1 2 \frac{t}{t+1}*\frac{t-1}{t}*\frac{t-2}{t-1}...*\frac{1}{2} t+1t∗tt−1∗t−1t−2...∗21,然后只剩下一个人
然 后 是 概 率 d p \color{Red}然后是概率dp 然后是概率dp
设老虎 i i i只,鹿 j j j只,令 s = i + j s=i+j s=i+j
Ⅰ . 老 虎 和 人 相 遇 的 概 率 是 p 1 = 2 i s ∗ ( s + 1 ) Ⅰ.老虎和人相遇的概率是p_1=\frac{2i}{s*(s+1)} Ⅰ.老虎和人相遇的概率是p1=s∗(s+1)2i
Ⅱ . 老 虎 和 鹿 p 2 = 2 i j s ∗ ( s + 1 ) Ⅱ.老虎和鹿p_2=\frac{2ij}{s*(s+1)} Ⅱ.老虎和鹿p2=s∗(s+1)2ij
Ⅲ . 鹿 和 鹿 p 3 = j ∗ ( j − 1 ) s ∗ ( s + 1 ) Ⅲ.鹿和鹿p_3=\frac{j*(j-1)}{s*(s+1)} Ⅲ.鹿和鹿p3=s∗(s+1)j∗(j−1)
Ⅳ . 人 和 鹿 p 4 = 2 j s ∗ ( s + 1 ) Ⅳ.人和鹿p_4=\frac{2j}{s*(s+1)} Ⅳ.人和鹿p4=s∗(s+1)2j
Ⅴ . 老 虎 和 老 虎 p 5 = i ∗ ( i − 1 ) s ∗ ( s + 1 ) Ⅴ.老虎和老虎p_5=\frac{i*(i-1)}{s*(s+1)} Ⅴ.老虎和老虎p5=s∗(s+1)i∗(i−1)
假如当人碰到鹿,选择宰掉鹿
f [ i ] [ j ] = p 2 ∗ f [ i ] [ j − 1 ] + p 3 ∗ f [ i ] [ j ] + p 4 ∗ f [ i ] [ j − 1 ] + p 5 ∗ f [ i − 2 ] [ j ] f[i][j]=p_2*f[i][j-1]+p_3*f[i][j]+p_4*f[i][j-1]+p_5*f[i-2][j] f[i][j]=p2∗f[i][j−1]+p3∗f[i][j]+p4∗f[i][j−1]+p5∗f[i−2][j]
( 1 − p 3 ) ∗ f [ i ] [ j ] = p 2 ∗ f [ i ] [ j − 1 ] + p 4 ∗ f [ i ] [ j − 1 ] + p 5 ∗ f [ i − 2 ] [ j ] (1-p_3)*f[i][j]=p_2*f[i][j-1]+p_4*f[i][j-1]+p_5*f[i-2][j] (1−p3)∗f[i][j]=p2∗f[i][j−1]+p4∗f[i][j−1]+p5∗f[i−2][j]
假如当人碰到鹿,选择放鹿一马
f [ i ] [ j ] = p 2 ∗ f [ i ] [ j − 1 ] + p 3 ∗ f [ i ] [ j ] + p 4 ∗ f [ i ] [ j ] + p 5 ∗ f [ i − 2 ] [ j ] f[i][j]=p_2*f[i][j-1]+p_3*f[i][j]+p_4*f[i][j]+p_5*f[i-2][j] f[i][j]=p2∗f[i][j−1]+p3∗f[i][j]+p4∗f[i][j]+p5∗f[i−2][j]
( 1 − p 3 − p 4 ) ∗ f [ i ] [ j ] = p 2 ∗ f [ i ] [ j − 1 ] + p 5 ∗ f [ i − 2 ] [ j ] (1-p_3-p_4)*f[i][j]=p_2*f[i][j-1]+p_5*f[i-2][j] (1−p3−p4)∗f[i][j]=p2∗f[i][j−1]+p5∗f[i−2][j]
二者取 m a x max max即可,无脑概率 d p dp dp
#include <bits/stdc++.h>
using namespace std;
double f[1009][1009];
int main()
{
int T,n,m,casenum=0; cin >> T;
while( T-- )
{
cin >> n >> m;//老虎和麋鹿
for(int i=0;i<=m;i++) f[0][i]=1.0;
for(int i=1;i<=n;i++)//枚举老虎的量
for(int j=0;j<=m;j++)
{
if( i%2==1 ) f[i][j]=0.0;
else
{
double s=(i+j)*(i+j+1);
double p1 = 2.0*i/s;//和老虎相遇
double p2 = 2.0*i*j/s;
double p3 = j*(j-1.0)/s;
double p4 = 2.0*j/s;
double p5 = i*(i-1.0)/s;
double killer=0,goodman=0;
if( j>=1 ) killer+=(p2+p4)*f[i][j-1];
killer = ( killer+p5*f[i-2][j] )/(1-p3);
if( j>=1 ) goodman+=p2*f[i][j-1];
goodman = ( goodman+p5*f[i-2][j] )/(1-p3-p4);
f[i][j] = max( killer,goodman );
}
}
printf("Case %d: %.7lf\n",++casenum,f[n][m] );
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++) f[i][j]=0;
}
}
本文地址:https://blog.csdn.net/jziwjxjd/article/details/109234690
上一篇: java邮箱工具类
下一篇: 微信怎么制作同款公式头像?