Broken robot CodeForces
来源:互联网 发布:健身会馆软件 编辑:程序博客网 时间:2024/06/11 16:21
题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000
先讲坑点,1原地停留算一步,2要考虑机器人在同一层楼无限走路,3,m=1情况特殊考虑;
思路:因为是期望dp所以是逆推;从底层推到机器人所在层数;
先最外面套一层关于层数的循环;然后在套一层代表机器人可以在同一层游荡的循环,(循环次数随意,只要不超时,且使得结果在误差范围内都行,66好看);
然后就是同一层的循环;
若机器人不在两端,就是有个地方可以呆
dp[i][j]=dp[i+1][j](1.0/4)+dp[i][j-1](1.0/4)+dp[i][j+1](1.0/4)+dp[i][j](1.0/4)+1;
如果在两端就是三个地方可以呆;
公式就是上面的稍改;
#include<iostream>#include<cmath>#include<algorithm>using namespace std;double dp[1010][1010];int main(){ int n,m,a,b; scanf("%d%d%d%d",&n,&m,&a,&b); if(n==a) printf("0.0000000000\n"); else { for(int i=n-1;i>=a;i--) { for(int k=1;k<=66;k++) { for(int j=1;j<=m;j++) { if(m==1) dp[i][1]=(dp[1+i][1]*1.0/2+1)/(1.0/2); else if(j==1) dp[i][j]=(dp[i+1][j]*(1.0/3)+dp[i][j+1]* (1.0/3)+1)/(2.0/3); else if(j==m) dp[i][j]=(dp[i+1][j]*(1.0/3)+dp[i][j-1]*(1.0/3)+1)/(2.0/3); else dp[i][j]=(dp[i+1][j]*(1.0/4)+dp[i][j-1]*(1.0/4)+dp[i][j+1]*(1.0/4)+1)/(3.0/4); } } } printf("%.10f\n",dp[a][b]); }}
阅读全文
0 0
- Broken robot CodeForces
- CodeForces 24D Broken robot(三对角矩阵)
- CodeForces 24D Broken robot (概率DP)
- CodeForces 24D Broken robot(概率dp+三对角矩阵)
- CodeForces 24D Broken robot (三对角矩阵消元)
- Broken robot (概率dp)
- D. Broken robot DP求期望
- CodeForces 370D Broken Monitor
- CodeForces-171D Broken checker
- CF 24 D. Broken robot dp(概率,高斯消元)
- codeforces A. Ciel and Robot
- Codeforces 589J. Cleaner Robot
- Codeforces 618 E . Robot Arm
- Codeforces 626A Robot Sequence
- Codeforces 626A Robot Sequence
- CodeForces-626A-Robot Sequence
- CodeForces 589J Cleaner Robot
- CodeForces 589 J Cleaner Robot
- MySQL入门
- 网易题目:砖块
- Java jdbc入门
- Java BeanUtils 组件 使用
- jdbc 连接池
- Broken robot CodeForces
- Java 监听器,国际化
- Java 文件上传与下载、email
- Java 反射、注解
- Java 使用Log4J进行日志操作
- 使用electron构建跨平台Node.js桌面应用
- Java Struts2 (一)
- Java Struts2 (二)
- Java Struts2 (四)