HDU3853:LOOPS

又是被HDU针对的一天HDU3853:LOOPS

题目大意

传送门
在这里插入图片描述

思路

我们可以设 d p [ i ] [ j ] dp[i][j] dp[i][j]表示 ( i , j ) (i,j) (i,j)到终点的期望能量,那么 d p [ i ] [ j ] = d p [ i ] [ j + 1 ] × p r o [ i ] [ j ] [ 1 ] ( 走 到 这 个 点 的 概 率 ) + d p [ i + 1 ] [ j ] × p r o [ i ] [ j ] [ 2 ] + d p [ i ] [ j ] × p r o [ i ] [ j ] [ 3 ] + 2 dp[i][j]=dp[i][j+1]\times pro[i][j][1](走到这个点的概率)+dp[i+1][j]\times pro[i][j][2]+dp[i][j]\times pro[i][j][3]+2 dp[i][j]=dp[i][j+1]×pro[i][j][1]()+dp[i+1][j]×pro[i][j][2]+dp[i][j]×pro[i][j][3]+2,我们对这个东西进行移项变号就是 d p [ i ] [ j ] × ( 1 − p r o [ i ] [ j ] [ 3 ] ) = d p [ i ] [ j + 1 ] × p r o [ i ] [ j ] [ 1 ] + d p [ i + 1 ] [ j ] × p r o [ i ] [ j ] [ 2 ] dp[i][j]\times (1-pro[i][j][3])=dp[i][j+1]\times pro[i][j][1]+dp[i+1][j]\times pro[i][j][2] dp[i][j]×(1pro[i][j][3])=dp[i][j+1]×pro[i][j][1]+dp[i+1][j]×pro[i][j][2],于是 d p [ i ] [ j ] = d p [ i ] [ j + 1 ] × p r o [ i ] [ j ] [ 1 ] + d p [ i + 1 ] [ j ] × p r o [ i ] [ j ] [ 2 ] 1 − p r o [ i ] [ j ] [ 3 ] dp[i][j]=\frac{dp[i][j+1]\times pro[i][j][1]+dp[i+1][j]\times pro[i][j][2]}{1-pro[i][j][3]} dp[i][j]=1pro[i][j][3]dp[i][j+1]×pro[i][j][1]+dp[i+1][j]×pro[i][j][2],最后输出就好了,记得无限输出,再特判一下 p r o [ i ] [ j ] [ 3 ] = 1 pro[i][j][3]=1 pro[i][j][3]=1的情况

代码又被HDU封印了

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

#define Int register int
#define int long long
#define MAXN 1005

int r,c;
double dp[MAXN][MAXN],pro[MAXN][MAXN][4];

void init()
{
	for(Int i=1;i<=r;++i)
		for(Int j=1;j<=c;++j)
		 	for(Int k=1;k<=3;++k)
		 		scanf ("%lf",&pro[i][j][k]);
}

void Work()
{
	for(Int i=r;i>=1;--i)
		for(Int j=c;j>=1;--j)
		{
			if (pro[i][j][1] == 1.0) continue;
			dp[i][j]=(pro[i][j][2]*dp[i][j+1]+pro[i][j][3]*dp[i+1][j]+2)/(1-pro[i][j][1]);
		}
}

signed main()
{
	while (scanf("%lld%lld",&r,&c) != EOF)
	{
		memset (dp,0,sizeof (dp));
		init();
		Work();
		printf("%.3lf\n",dp[1][1]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值