用邻接矩阵计算概率
Calc of Probabilities with a adjacency matrix
这是一个编程竞赛问题。它的输入在这里,输出在这里。
一个醉汉想离开酒吧回家。但他不记得他的家在哪里。所以,他会敲开城市的每一扇门,等待他的家人来接他(总是有人等着接他)。
给定邻接矩阵 a 。其中每个值(i,j)表示醉汉从第i个位置出发到达第j个位置的概率。醉汉走最多m步找不到家的概率是多少?
直到现在我都不知道这是什么问题。搜索网络和书籍,我发现要计算离开节点i的概率,在m步中到达节点j的概率由 a 矩阵(a ^m)的m次幂的位置(i,j)给出。醉汉不回家的概率可以直接计算,也可以通过计算1 -醉汉到家的概率(P(A) = 1 - P(非A))来计算。
输入的第一行由一行四个整数组成n (0 <= n <= 100),t (0
<= 100),k (0 <= n), m (0 <= 100),分别表示房子的数量、酒吧的位置、醉汉的房子和尝试的次数。在这一行之后,给出n行n个整数来描述概率矩阵。0标记输入结束
每个测试用例的输出分为两行,格式必须为:
dInstancia :
v
其中d表示实例的数量(从1开始),v是四舍五入到小数点后6位的概率。每个测试用例之间有一个空行。
输入示例:
2 1 2 1
0.5 - 0.5
0.5 - 0.5
3 1 2 2
0.25 0.25 0.5
0.25 0.5 0.25
0.5 0.25 0.25
0
输出示例:
Instancia 1
0.500000Instancia 2
0.562500
任何有关算法、书籍、网站或提示的帮助都是值得赞赏的;
有了这些信息,我必须解决这个问题,直到现在,我只能做这个代码:
#include <stdio.h>
#include <string.h>
struct Matrix {
double v[100][100];
int row, col; // row x col
Matrix(int n, int m) {
memset(v, 0, sizeof(v));
col = n;
row = m;
}
Matrix operator*(const Matrix& x) const {
Matrix ret(row, x.col);
for(int i = 0; i < row; i++) {
for(int k = 0; k < col; k++) {
if (v[i][k])
for(int j = 0; j < x.col; j++)
ret.v[i][j] += v[i][k] * x.v[k][j];
}
}
return ret;
}
};
int main(){
int n,t,k,m;
int inst = 0;
while(scanf("%d %d %d %d",&n,&t,&k,&m) == 4){
Matrix mat(n,n);
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
scanf("%lf",&mat.v[i][j]);
//identity matrix
Matrix aux(n,n);
for (int i = 0; i < n; ++i)
aux.v[i][i] = 1;
//take the power of the matrix
for (int i = 0; i < m; ++i) {
aux = aux*mat;
/* PRINT MATRIX
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%lf ",aux.v[i][j]);
}
printf("n");
}
*/
}
printf("Instancia %dn%.6lfnn",++inst,aux.v[t-1][k-1]);
}
}
正如stgatilov所说,你忘记了他一到家就不会离开家。
但是不需要动态规划。只要稍微改变一下概率矩阵,如果他家在i
,那么将从i
到i
的概率改为1
,对于任何不等于i
的j
,将从i
到j
的概率改为0
。
那么它应该可以正常工作。
注意:还有一个可能的优化。您可以通过平方来使用Exponentiation,而不是将矩阵m
乘以。
似乎你已经忘记了,男人可以在比m步回家。现在你在计算他在m步后不在家的概率,假设他没有因为任何原因停下来。
我认为你最好实现一些动态规划。例如R[i, p] =该男子在i步中未到家的概率,并且在i-step之后他将在p处。重新计算有点类似于矩阵乘法,通过将表R的适当条目相加得到答案。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 关于骰子概率计算的一个C++问题
- 计算 UUID 是唯一的概率
- 视觉C++计算事件的概率
- 使用std :: binomial_distribution计算概率
- C++:计算每次迭代期间的概率百分比
- 如何计算字符串中字母的概率
- 计算概率C++伯努利试验
- 如何计算 CDF C++中正态分布概率
- 计算概率百分比
- 用邻接矩阵计算概率
- 如何用给定的数据计算概率
- 计算类似于二项和的条件概率