又是被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]×(1−pro[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]=1−pro[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;
}