HDU 3853 LOOPS

来源:互联网 发布:校园寝室网络设计方案 编辑:程序博客网 时间:2024/06/05 15:25

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853


题意:有一个n×m的矩阵,起点是(1,1) 终点是(n,m),每个点都有三个概率,向下走,向右走,在原地(除了边界)。求走到终点的期望步数。

思路:f[i][j]表示在(i,j)点到终点的期望步数。f[i][j] = p1 * f[i+1][j] + p2 * f[i][j+1] + p3 * f[i][j] + 2。化简得,f[i][j] = p1 / ( 1 - p3 ) * f[i+1][j] + p2 / ( 1 - p3 ) * f[i][j+1] + 2 / ( 1 - p3 ).如果p3为1,那么这个点就不能走,所以f[i][j]为0。 


#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <cstdlib>#include <iostream>#include <algorithm>#include <stack>#include <map>#include <set>#include <vector>#include <sstream>#include <queue>#include <utility>using namespace std;#define rep(i,j,k) for (int i=j;i<=k;i++)#define Rrep(i,j,k) for (int i=j;i>=k;i--)#define Clean(x,y) memset(x,y,sizeof(x))#define LL long long#define ULL unsigned long long#define inf 0x7fffffff#define mod %100000007const int maxn = 1010;struct node{    double p[3];};node a[maxn][maxn];double ans[maxn][maxn];int n,m;void init(){    rep(i,1,n)        rep(j,1,m)            scanf("%lf %lf %lf",&a[i][j].p[0],&a[i][j].p[1],&a[i][j].p[2]);    Clean(ans,0);}void solve(){    ans[n][m] = 0;    Rrep(i,n,1)        Rrep(j,m,1)        {            if ( i == n && j == m ) continue;            if ( a[i][j].p[0] == 1 )                ans[i][j] = 0;            else                ans[i][j] = ( a[i][j].p[1] * ans[i][j+1] + a[i][j].p[2] * ans[i+1][j] + 2.0 ) / ( 1 - a[i][j].p[0] );        }}int main(){    while( ~scanf("%d%d",&n,&m) )    {        init();        solve();        printf("%0.3f\n",ans[1][1]);    }    return 0;}



0 0
原创粉丝点击