hdu 3853 LOOPS

题意:

给出一个n * m的格子,一个人在一开始在(1,1),要走到(n,m)。

假设在(x,y),每次她可以花费2点的魔法能量,p1的概率走到(x,y),p2的概率走到(x,y+1),p3的概率走到(x+1,y),保证p1+p2+p3 = 1。

问从(1,1)走到(n,m)花费的期望是多少。

思路:

简答概率dp,逆推。

dp[i][j] = (dp[i][j+1] * p2 + dp[i+1][j] * p3) / (1 - p1)。

但是要注意,当p1 == 1的时候要跳过

代码:

复制代码
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 1005;
 6 double dp[N][N];
 7 double a[N][N][3];
 8 int main()
 9 {
10     int n,m;
11     while (scanf("%d%d",&n,&m) != EOF)
12     {
13         memset(dp,0,sizeof(dp));
14         for (int i = 1;i <= n;i++)
15         {
16             for (int j = 1;j <= m;j++)
17             {
18                 for (int k = 0;k < 3;k++)
19                 {
20                     scanf("%lf",&a[i][j][k]);
21                 }
22             }
23         }
24         dp[n][m] = 0;
25         for (int i = n;i >= 1;i--)
26         {
27             for (int j = m;j >= 1;j--)
28             {
29                 if (i == n && j == m) continue;
30                 if (fabs(1.0-a[i][j][0]) < 1e-8) continue;
31                 dp[i][j] = (a[i][j][1] * dp[i][j+1] + a[i][j][2] * dp[i+1][j] + 2.0) / (1.0-a[i][j][0]);
32             }
33         }
34         printf("%.3f\n",dp[1][1]);
35     }
36     return 0;
37 }
复制代码

 

posted @   qrfkickit  阅读(148)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示