HDU 4579 Random Walk (解方程)
来源:互联网 发布:局域网网络行为监控 编辑:程序博客网 时间:2024/05/22 10:48
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
题意 :n个位置,每次可以向前走1-m步或者向后者1-m步,或者不动,概率都可以计算出来。问从1走到n的期望步数。
http://acm.hdu.edu.cn/showproblem.php?pid=4579
由于m非常小,只有5。所以用dp[i]表示从位置i出发到达n的期望步数。
那么dp[n] = 0
dp[i] = sigma(dp[i + j] * p (i , i + j)) + 1 . (-m <= j <= m)
n个方程,n个变元,由于每个方程中的未知数不多,所以可以暴力消元。
每次的原则是以每个位置的方程,将高位全部消元,利用高位置的残留方程。
比如说以位置 i的方程,保留dp[i] = a1 * dp[i - 1] + a2 * dp[i - 2] …… am * dp[i - m]。
最后的常数便是结果,注意细节,以及小心RE,问题不大。
O(n * m)的复杂度从大到小暴力消元。
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>using namespace std;const int N = 50005;double p[N][11];int n , m , c[11];int l[N] , r[N];double a[N][11];double constant[N];bool zero (double d) { const double eps = 1e-6; return fabs(d) < eps;}int main () { #ifndef ONLINE_JUDGE freopen ("input.txt" , "r" , stdin); #endif while (scanf ("%d %d" , &n, &m) != EOF) { if (!n & !m) break; for (int i = 1 ; i <= n ; i ++) { int tot = 0; for (int j = 1 ; j <= m ; j ++) { scanf ("%d" , &c[j]); tot += c[j]; } double other = 1.0; for (int j = -m ; j < 0 ; j ++) { p[i][j + m] = 0.3 * c[-j] / (1 + tot); if (i + j >= 1) other -= p[i][j + m]; } for (int j = 1 ; j <= m ; j ++) { p[i][j + m] = 0.7 * c[j] / (1 + tot); if(i + j <= n) other -= p[i][j + m]; } p[i][m] = other; } memset (a , 0 , sizeof(a)); for (int i = n - 1 ; i > 0 ; i --) { l[i] = max(i - m , 1); r[i] = min(n , i + m); for (int j = 0 ; j < r[i] - l[i] + 1 ; j ++) { a[i][j] = p[i][(l[i] + j) - i + m]; } constant[i] = 1.0; for (int j = r[i] ; j > i ; j --) { if (j == n) a[i][j - l[i]] = 0; else { double q = a[i][j - l[i]]; if (zero(q)) continue; for (int k = 0 ; k < j - l[j] ; k ++) { a[i][k + l[j] - l[i]] += a[j][k] * q; } a[i][j - l[i]] = 0; constant[i] += constant[j] * q; } } double q = 1 - a[i][i - l[i]]; for (int j = 0 ; j < r[i] - l[i] + 1 ; j ++) { a[i][j] = a[i][j] / q; } a[i][i - l[i]] = 0; constant[i] = constant[i] / q; } printf ("%.2f\n" , constant[1]); } return 0;}
- HDU 4579 Random Walk (解方程)
- HDOJ 4579 Random Walk 解方程
- Hdu 4487 Maximum Random Walk
- hdu 4487 Maximum Random Walk
- hdu 4487 Maximum Random Walk
- HDU 4487 Maximum Random Walk
- HDU 4487 Maximum Random Walk(概率DP)
- hdu 4487 Maximum Random Walk (概率dp)
- hdu 4487 概率dp Maximum Random Walk
- hdu 4487 Maximum Random Walk(概率dp)
- HDU 4487 Maximum Random Walk 概率DP
- HDU 4487 Maximum Random Walk (概率DP)
- HDU 4487Maximum Random Walk 概率 dp
- Random Walk
- random walk
- random walk
- 6.2.4 随机游走(Random Walk)
- 简单概率dp-hdu-4487-Maximum Random Walk
- static应用(一)
- 20个开源项目托管站点推荐
- 内存映射文件
- VMware虚拟机中安装redhat9.0 操作系统(初学linux,很详细)
- 一个字母引起的错误
- HDU 4579 Random Walk (解方程)
- HDU 4585——Shaolin
- IBM的新蛋糕:开源
- 获取Spring对象的公共方法
- c/c++ 函数指针的用法
- ECAT_CheckWatchdog()
- 读取字符的总结
- 11-mysqli预编译执行dml语句
- 深入浅出Node.js(二):Node.js&NPM的安装与配置