简单递推
来源:互联网 发布:移民布里斯班后 知乎 编辑:程序博客网 时间:2024/05/18 10:14
题目链接:[点这儿].
题目:
现在有两个好友A和B,住在一片长有蘑菇的由
n*m
个方格组成的草地,A在(1,1)
,B在(n,m)
。现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)
或(i+1,j)
这样的路线,在草地上有k
个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?
解析:
如果知道
(1,1)
到(n,m)
总有多少条路径和不踩蘑菇有多少条路径这个题就解出来了,因此,这题转化为求路径数.但是有个问题,比如到右边界的时候,本来它可以向下或向右走,但是向右走不通,因此啊,向右走的那个分支就都会向下走,也就是说,向下会走两次,这个地方要特别注意,很多做过的同学都说按路径走不行,其实是可以的,只不过他们没有完全理解这个边界而已。
根据上面的解析,我们就可以得出状态转移方程了:
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪denominatori,j=(j==m?2:1)∗denominatori−1,j+(i==n?2:1)∗denominatori,j−1numeratori,j=mpi,j?0:(j==m?2:1)∗numeratori−1,j+(i==n?2:1)∗numeratori,j−1
denominator[i][j]
表示总共的路径数,numerator[i][j]
表示不踩蘑菇的路径数.
代码:
#include <bits/stdc++.h>using namespace std;typedef long long LL;int main(){ int n, m, k; while (cin >> n >> m >> k) { vector<vector<LL> > mp(n + 1, vector<LL>(m + 1, 0)), numerator(mp), denominator(mp); for (int i = 0; i < k; i++) { int x, y; cin >> x >> y; mp[x][y] = 1; } numerator[0][1] = denominator[0][1] = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { denominator[i][j] = (j == m ? 2 : 1) * denominator[i - 1][j] + (i == n ? 2 : 1) * denominator[i][j - 1]; numerator[i][j] = mp[i][j] ? 0 : (j == m ? 2 : 1) * numerator[i - 1][j] + (i == n ? 2 : 1) * numerator[i][j - 1]; } } printf("%.2f\n", numerator[n][m] * 1.0 / denominator[n][m]); } return 0;}
阅读全文
0 0
- UVA10943简单递推
- hdu2501 简单递推
- 简单递推
- 简单递推
- 简单递推
- 简单递推
- 简单递推
- UVa 11000 简单递推
- hdu 2046 简单递推
- poj 2081 简单递推
- Flags-Ural1225简单递推
- HDU 2190 简单递推
- POJ1050 简单的递推~
- 简单的递推练习
- 简单的递推练习
- 简单的递推练习
- POJ 2590 Steps(简单数列递推)
- POJ 3299 Humidex(简单公式递推)
- redis源码分析(一)复习redis命令、持久化方案、主从同步原理、配置
- Ubuntu16.04 安装 OpenWRT openjdk-7-jdk
- flask表单提交时遇到的问题-bad request(400)
- -TEST 17 for NOIP 暴力有毒(190-300)
- 关于linux敲入lsof无效解决办法
- 简单递推
- Excel在统计分析中的应用—第六章—抽样分布-小样本的抽样分布(t分布与正态分布的渐进)
- POJ 3783 (DP, 动态规化)
- 《深入理解java虚拟机》pdf 下载
- 加法与减法
- Wtblog 想法
- 《Java核心技术卷》下载 pdf
- 四、Docker安装使用 容器
- [算法分析与设计] leetcode 每周一题: Contains Duplicate III