Broken robot( CodeForces - 24D,高斯消元解后效性 DP)

一.题目链接:

CodeForces-24D

二.题目大意:

有一个 n × m 大小的地图,初始位置在 (x, y) 点.

每秒可向左、右、下走或不动,求从初始点到最后一行所需时间的期望.

三.分析:

设 dp[i][j] 为从 (i, j) 点走到最后一行时间的期望.

易得当 m == 1 时,此时只能向下走或不动,因此答案为 2 * (n - x).

当 m > 1 时:

dp[i][j]=\left\{\begin{matrix} \frac{1}{3}\times (dp[i][j] + dp[i][j + 1]+dp[i + 1][j])\; \; \; \; (i == 1) \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \;\; \; \; \; \; \; \; \; \; \; \;\\ \\ \frac{1}{4}\times (dp[i][j] + dp[i][j - 1] + dp[i][j + 1]+dp[i + 1][j])\; \; \; \; (2 \leq i \leq m - 1) \\ \\ \frac{1}{3}\times (dp[i][j] + dp[i][j - 1]+dp[i + 1][j])\; \; \; \; (i == m) \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \;\; \; \; \; \; \; \; \; \; \; \ \end{matrix}\right.

经移项化简可得:

\left\{\begin{matrix} dp[i][1] - \frac{1}{2}dp[i][2] = \frac{3}{2} + \frac{1}{2} dp[i + 1][1]\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\ \\ -\frac{1}{4}dp[i][j - 1] + \frac{3}{4}dp[i][j]-\frac{1}{4}dp[i][j +1] = 1 + \frac{1}{4}dp[i + 1][j]\; \; \; \; \; \; \; (2 \leq j \leq m - 1) \\ \\ dp[i][m - 1] - 2dp[i][m] = -3 - dp[i + 1][m] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \end{matrix}\right.

即:

\left\{\begin{matrix} dp[i][1] - \frac{1}{2}dp[i][2] = \frac{3}{2} + \frac{1}{2}dp[i + 1][1] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\ \\ \\ -\frac{1}{4}dp[i][1] + \frac{3}{4}dp[i][2]-\frac{1}{4}dp[i][3] = 1 + \frac{1}{4}dp[i + 1][2] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\ \\ -\frac{1}{4}dp[i][2] + \frac{3}{4}dp[i][3]-\frac{1}{4}dp[i][4] = 1 + \frac{1}{4}dp[i + 1][3] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\ ...... \\ -\frac{1}{4}dp[i][m - 2] + \frac{3}{4}dp[i][m - 1]-\frac{1}{4}dp[i][m] = 1 + \frac{1}{4}dp[i + 1][m - 1] \\ \\ dp[i][m - 1] - 2dp[i][m] = -3 - dp[i + 1][m] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \end{matrix}\right.

设第一行 a[1] = -\frac{1}{2} \;\;\;\; b[1] = \frac{3}{2} + \frac{1}{2}dp[i + 1][1]

则  r1: dp[i][1]+a[1]dp[i][2]=b[1]

r2+\frac{1}{4}r1: (\frac{1}{4}a[1]+\frac{3}{4})dp[i][2]-\frac{1}{4}dp[i][3]= \frac{1}{4}b[1]+1+\frac{1}{4}dp[i +1][2]

等式两边同除以  \frac{1}{4}a[1]+\frac{3}{4}  得:

dp[i][2] + \frac{-\frac{1}{4}}{\frac{1}{4}a[1]+\frac{3}{4}}dp[i][3] = \frac{\frac{1}{4}b[1]+1+\frac{1}{4}dp[i +1][2]}{\frac{1}{4}a[1]+\frac{3}{4}}

令 a[2]=\frac{-\frac{1}{4}}{\frac{1}{4}a[1]+\frac{3}{4}} \;\;\; b[2]=\frac{\frac{1}{4}b[1]+1+\frac{1}{4}dp[i +1][2]}{\frac{1}{4}a[1]+\frac{3}{4}}

则 dp[i][2]+a[2]dp[i][3]=b[2]

同理可得:

\left\{\begin{matrix}dp[i][2]+a[2]dp[i][3]=b[2] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\ \\ dp[i][3]+a[3]dp[i][4]=b[3] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\ ...... \\ dp[i][m - 1]+a[m - 1]dp[i][m]=b[m -1]\;\;\;\;\;\;\;\;\;\;\;\;\; \end{matrix}\right.

其中

a[j]=\frac{-\frac{1}{4}}{\frac{1}{4}a[j-1]+\frac{3}{4}} \;\; b[j]=\frac{\frac{1}{4}b[j-1]+1+\frac{1}{4}dp[i +1][j]}{\frac{1}{4}a[j-1]+\frac{3}{4}} \;\; (2 \leq j \leq m -1)

令 a[2]=-2 \;\;\; b[m] = -3-dp[i + 1][m]

可得:

\left\{\begin{matrix} dp[i][1] + a[1]dp[i][2]=b[1] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\\\ dp[i][2] + a[2]dp[i][3]=b[2] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\\\ dp[i][3] + a[3]dp[i][4]=b[3] \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \\ ...\\ dp[i][m-1] + a[m-1]dp[i][m]=b[m-1] \\\\ dp[i][m -1] + a[m]dp[i][m]=b[m] \;\;\;\;\;\;\;\;\;\;\;\;\; \end{matrix}\right.

由最后两个式子可得:

dp[i][m]=\frac{b[m] - b[m -1]}{a[m]-a[m-1]}

之后递推回带可得所有 dp[i][j] 的值

四.代码实现:

#include <bits/stdc++.h>
using namespace std;

const int M = (int)1e3;

int n, m, x, y;
double a[M + 5], b[M + 5];
double dp[M + 5][M + 5];

void work()
{
    for(int i = 1; i <= n; ++i)
        dp[1][i] = 0;
    for(int i = n - 1; i >= x; --i)
    {
        a[1] = -1.0 / 2.0;
        b[1] = 1.0 / 2.0 * dp[i + 1][1] + 3.0 / 2.0;
        for(int j = 2; j <= m - 1; ++j)
        {
            a[j] = (-1.0 / 4.0) / (1.0 / 4.0 * a[j - 1] + 3.0 / 4.0);
            b[j] = (1.0 / 4.0 * b[j - 1] + 1.0 / 4.0 * dp[i + 1][j] + 1.0) / (1.0 / 4.0 * a[j - 1] + 3.0 / 4.0);
        }
        a[m] = -2.0;
        b[m] = -3.0 - dp[i + 1][m];
        dp[i][m] = (b[m] - b[m - 1]) / (a[m] - a[m - 1]);
        for(int j = m - 1; j >= 1; --j)
            dp[i][j] = b[j] - a[j] * dp[i][j + 1];
    }
    printf("%.4f\n", dp[x][y]);
}

int main()
{
    scanf("%d %d %d %d", &n, &m, &x, &y);
    if(m == 1)
        printf("%d\n", 2 * (n - x));
    else
        work();
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值