【HDOJ】4579 Random Walk
1. 题目描述
一个人沿着一条长度为n个链行走,给出了每秒钟由i到j的概率($i,j \in [1,n]$)。求从1开始走到n个时间的期望。
2. 基本思路
显然是个DP。公式推导也相当容易。不妨设$dp[i], i \in [1,n]$表示由i到n的期望时间。
\begin{align}
dp[i] &= \Sigma_{j=1}^{n} p(i, j) (dp[j] + 1), &j<n\\
dp[i] &= 0 &i=n
\end{align}
显然这是一个n元方程组,可以高斯消元解。但是因为n很大,因此不能直接套用高斯消元。但是通过观察系数矩阵可以发现规律。
以$n=7, m=2$为例,$\times$表示$A_{ij}$不为0。
发现每个行向量最多包含$2m+1$个非零向量,即$[i-m, i+m]$。因此,在高斯消元的过程中,实际每次需要减掉的系数最多也就$2m+1$个。
因为$m \in [1,5]$,可以直接模拟非零系数的消元。因为$i-m$有可能小于0,因此,将$[i-m,i+m]$映射到$[0,2m]$的区间内,$A_{ii}$恰好映射到$P_{im}$。
最后可以生成几个小规模的n,与高斯消元对拍一下。
3. 代码
/* 4579 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const double eps = 1e-;
const int maxn = ;
const int maxm = ;
double g[maxn][maxm], p[maxn][maxm];
double v[maxn], x[maxn];
int C[maxn][];
int n, m; void solve() {
int i, j, k; memset(p, , sizeof(p));
for (i=; i<n; ++i) {
int tot = ;
double tmp = 0.0;
for (j=; j<=m; ++j)
tot += C[i][j]; for (j=; j<=m; ++j) {
if (i-j >= ) {
p[i][m-j] = 0.3 * C[i][j] / tot;
tmp += p[i][m-j];
}
if (i+j <= n) {
p[i][m+j] = 0.7 * C[i][j] / tot;
tmp += p[i][m+j];
}
}
p[i][m] = -tmp;
v[i] = -;
}
p[n][m] = ;
v[n] = ; memcpy(g[], p[], sizeof(p[]));
for (i=,k=; i<=n; ++i,++k) {
int l = max(k-m, );
int r = min(k+m, n);
for (j=i; j<=n&&j-k<=m; ++j) {
if (fabs(p[k][m]) < eps)
continue;
double t = p[j][k-j+m] / p[k][m];
for (int kk=k+; kk<=n&&kk-k<=m; ++kk)
p[j][kk-j+m] -= t * p[k][kk-k+m];
v[j] -= t * v[k];
} l = max(i-m, );
r = min(i+m, n);
for (j=l; j<=r; ++j)
g[i][j-i+m] = p[i][j-i+m];
} x[n] = ;
for (i=n-,k=n; i>; --i,--k){
for (j=i; j>&&k-j<=m; --j)
v[j] -= x[k] * g[j][k-j+m];
x[i] = v[i] / g[i][m];
} printf("%.2lf\n", x[]);
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif while (scanf("%d%d",&n,&m)!=EOF && (n||m)) {
rep(i, , n+)
rep(j, , m+)
scanf("%d", &C[i][j]);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
4. 数据生成器
import sys
import string
from random import randint def GenData(fileName):
with open(fileName, "w") as fout:
t = 10
for tt in xrange(t):
n = randint(1, 200)
m = randint(1, 5)
fout.write("%d %d\n" % (n, m))
L = [0] * m
for i in xrange(n):
for j in xrange(m):
L[j] = randint(1, 9)
fout.write(" ".join(map(str, L)) + "\n")
fout.write("0 0\n") def MovData(srcFileName, desFileName):
with open(srcFileName, "r") as fin:
lines = fin.readlines()
with open(desFileName, "w") as fout:
fout.write("".join(lines)) def CompData():
print "comp"
srcFileName = "F:\Qt_prj\hdoj\data.out"
desFileName = "F:\workspace\cpp_hdoj\data.out"
srcLines = []
desLines = []
with open(srcFileName, "r") as fin:
srcLines = fin.readlines()
with open(desFileName, "r") as fin:
desLines = fin.readlines()
n = min(len(srcLines), len(desLines))-1
for i in xrange(n):
ans2 = int(desLines[i])
ans1 = int(srcLines[i])
if ans1 > ans2:
print "%d: wrong" % i if __name__ == "__main__":
srcFileName = "F:\Qt_prj\hdoj\data.in"
desFileName = "F:\workspace\cpp_hdoj\data.in"
GenData(srcFileName)
MovData(srcFileName, desFileName)
【HDOJ】4579 Random Walk的更多相关文章
- 【BZOJ3470】Freda’s Walk 概率与期望
[BZOJ3470]Freda’s Walk Description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一 ...
- HDU 4579 Random Walk (解方程组)
Random Walk Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)Total ...
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】5632 Rikka with Array
1. 题目描述$A[i]$表示二级制表示的$i$的数字之和.求$1 \le i < j \le n$并且$A[i]>A[j]$的$(i,j)$的总对数. 2. 基本思路$n \le 10^ ...
- 【HDOJ】4418 Time travel
1. 题目描述K沿着$0,1,2,\cdots,n-1,n-2,n-3,\cdots,1,$的循环节不断地访问$[0, n-1]$个时光结点.某时刻,时光机故障,这导致K必须持续访问时间结点.故障发生 ...
- 【HDOJ】4305 Lightning
1. 题目描述当一个结点lightning后,可以向其周围距离小于等于R的结点传播lightning.然后以该结点为中心继续传播.以此类推,问最终形成的树形结构有多少个. 2. 基本思路生成树级数模板 ...
- 【HDOJ】4373 Mysterious For
1. 题目描述有两种不同类型的循环,并给出一个由1.2组成的序列,表示嵌套的循环类型.问这样组着的循环一共需要多少次循环?并将结果模364875103. 2.基本思路显然,每当遇到一个类型1的序列,即 ...
- 【HDOJ】1667 The Rotation Game
1. 题目描述有个#字型的条带,可以从横线或竖线进行循环移动,求通过各种移动最终使中心的8个字符全等的长度最短并相同长度字典序最小的操作序列.2. 基本思路24个数据,8种移动方式,数据量很小了,所以 ...
- 【HDOJ】4374 One hundred layer
线性DP,使用单调队列优化. /* 4374 */ #include <iostream> #include <sstream> #include <string> ...
随机推荐
- KnockoutJS(3)-绑定语法
绑定语法大致分为2种: 1. 数据绑定(data-bind syntax) 2. 绑定上下文(Binding Context) 下面针对这2中绑定语法分别介绍一下 1. 绑定上下文(Binding C ...
- opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用
- Redis 与 数据库处理数据的两种模式(转)
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...
- 几个好用的截取字符串的php函数分享
分享几个好用的PHP 截取字符串函数(支持gb2312和utf-8). 1.截取GB2312字符用的函数 <?php /** **截取中文字符串 * edit by www.jbxue.com ...
- 为 Web 设计师准备的 25+ 款扁平 UI 工具包
Flat UI Kit by Riki Tanone (free) Flat UI Kit (PSD) by Devin Schulz (free) Eerste UI Kit (free) Metr ...
- hibernate的n+1问题
下面选自<精通Hibernate:Java对象持久化技术详解>作者:孙卫琴 在Session的缓存中存放的是相互关联的对象图.默认情况下,当Hibernate从数据库中加载Customer ...
- wpf 绑定ObservableCollection 的Count属性
相信大家都遇到过这样的需求,DataGrid里显示符合筛选条件的学生列表,上方TextBolck里显示学生总数,大家可以这样做: 1,XAML代码 <Window x:Class="O ...
- C语言数据结构之栈:中缀表达式的计算
*注:本人技术不咋的,就是拿代码出来和大家看看,代码漏洞百出,完全没有优化,主要看气质,是吧 学了数据结构——栈,当然少不了习题.习题中最难的也是最有意思的就是这个中缀表达式的计算了(可以算+-*/和 ...
- Kinetic使用注意点--ellipse
new Ellipse(config) 参数: config:包含所有配置项的对象. { radius: "半径,可以用数字a.数组[a,b]或对象{x:a,y:b}来表示" } ...
- 论文阅读(2014-2)----The YouTube Video Recommendation System
这是谷歌youtube在2010的一篇文章,估计现在的思路有很多升级了,但是里面的知识点还是很不错的.主要讲youtube的个性化推荐思路.下面根据论文的结构我把我理解的思路整理如下,如果有问题,欢迎 ...