HDU 3853 LOOPS

LOOPS

期望DP。題目意思很容易理解,這裏就不再解釋了。方程dp[i][j]表示從i,j點出發到達(R , C)的消耗能量的期望值。題目給了狀態轉移的幾個方向,dp[i][j] = x1 * dp[i][j] + x2 * dp[i][j + 1] + x3 * dp[i + 1][j] + 2 ; 這裏x1,x2,x3即爲從(i,j)走到(i,j),(i , j + 1) , (i + 1 , j)的概率,由於打開一扇門還需要2個能量值。然後整理一下。這裏需要注意的是存在某種情況:x1 = 1 ,這時我們需要特判一下。
不好意思。。之前由於貼代碼不慎。。貼了錯誤的上去。。。。現在特改正。。。尷尬


/*
    author   : csuchenan
    prog     : hdu 3853
    algorithm: DP
*/
#include <cstdio>
#include <cmath>
const int maxn = 1005 ;

const double eps = 1e-5 ;

struct Prob{
    double x1 , x2 , x3 ;
}prob[maxn][maxn] ;
double dp[maxn][maxn] ;


int main(){
    int R , C ;
    while(scanf("%d%d", &R , &C) != EOF){
       for(int i = 1 ; i <= R ; i ++){
            for(int j = 1 ; j <= C ; j ++){
                scanf("%lf%lf%lf" , &prob[i][j].x1 , &prob[i][j].x2
                , &prob[i][j].x3) ;
            }
       }
       dp[R][C] = 0 ;
       for(int i = R ; i >= 1 ; i --){
            for(int j = C ; j >= 1 ; j --){
                if(i == R && j == C)
                    continue ;

                if(fabs(1 - prob[i][j].x1) < eps)
                    continue ;

                double x1 , x2 , x3 ;

                x1 = prob[i][j].x1 ;
                x2 = prob[i][j].x2 ;
                x3 = prob[i][j].x3 ;

                dp[i][j] = (x2 * dp[i][j + 1] + x3 * dp[i + 1][j] + 2)
                /(1 - x1) ;
            }
       }
       printf("%.3f\n" , dp[1][1]) ;
    }
    return 0 ;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章