2018.08.30 花园(期望dp)

时间:2022-09-11 20:38:50

题目背景

SCOI2017 DAY2 T1

题目描述

小 A 的花园的长和宽分别是 L,H 。小 A 喜欢在花园里做游戏。每次做游戏的时候,他都先把花园均匀分割成 L×H 个小方块,每个方块的长和宽都是 1 。然后,小 A 会从花园的西北角的小方块出发,按照一定的规则移动,在到达花园东南角的小方块时结束游戏。每次行动时,他都会移动到当前所在的小方块的东面或南面相邻的小方块上。如果小 A 当前在从北向南数第 i 块,从西向东数第 j 块小方块上,他向东移动的概率是 Pij ,向南移动的概率则是 1-Pij 。

在花园里做游戏常常会弄脏衣服,花园的每个小方块内都有一定的不干净度,用 Dij 表示。而一次游戏结束后,小 A 总的不干净度就是他经过的所有格子中不干净度之和(起点和终点的不干净度也计算在内)。

小 B 因为小 A 经常把衣服弄脏感到苦恼,他可能会决定在小 A 做游戏前对花园进行一次打扫。小 B 在打扫花园时,会从花园的西北角的小方块出发,每次移动到当前所在的小方块的东面或南面相邻的小方块上,在到达花园的东南角时结束打扫,他经过的所有的格子的不干净度都会变为 0 。现在,小 B 想知道,在他选择了最优的打扫策略的情况下,小 A 做完游戏后总不干净度之和是多少?

输入格式

第一行输入两个空格隔开的正整数 L、H。

第二行一个整数 k,值为 0 或 1 ,k=0 表示小B不会打扫花园,k=1 表示小B会在游戏开始前打扫花园。

接下来 L 行,每行有 H 个自然数,第 i 行第 j 个数表示从北往南数第 i 个,从西往东数第 j 个小方块的不干净度 Dij 。

接下来 L 行,每行有 H 个实数,第 i 行第 j 个数表示从北往南数第 i 个,从西往东数第 j 个小方块的参数 Pij 。

输出格式

输出一个整数,表示问题的答案,四舍五入保留到整数。

样例数据 1

输入

3 3

0

200 100 100

200 100 300

100 200 300

0.5 0.5 0.0

1.0 1.0 1.0

输出

1000

样例数据 2

输入

3 3

1

200 100 100

200 100 300

100 200 300

0.2 0.8 0.0

0.8 0.3 0.0

1.0 1.0 1.0

输出

161

备注

【数据范围】

你的答案必须和标准输出完全一致才能得分,为确保精度误差在一定范围内的答案能被接受,

保证准确答案的小数点后第 1 位数字不是 4 或 5 。

0≤Dij≤10000 ;

0≤Pij≤1 最多包含两位小数 ;

PLi=1 (1≤i<H) 且 PiH=0 (1≤i<L),即走到棋盘外的概率为 0 ,最终必然会到达东南角结束。PLH=1,但到达这里时旅途已经结束了,这个数没有意义;

1≤L,H≤3000 。

2018.08.30 花园(期望dp)

特殊性质:0 表示没有特殊性质,1 表示除了最后一行和最后一列的小方块外,所有的小方块的参数都为 0.5 。


期望dp入门题啊。

一个点的状态可以从左边和上边的点转移过来。

这点想到就差不多了。

然后每个点被经过的次数的期望是可求得的,根据期望的线性性,直接把每个点的期望贡献加起来就是情况一的答案。

情况二就是要减去一个最长链。

注意输入的优化以及精度的控制。

代码:

#include<bits/stdc++.h>
#define N 1005
using namespace std;
int l,h,k;
double w[N][N],p[N][N],g[N][N],f[N][N];
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int main(){
    scanf("%d%d%d",&l,&h,&k);
    for(int i=1;i<=l;++i)
        for(int j=1;j<=h;++j)
            w[i][j]=1.0*read();
    for(int i=1;i<=l;++i)
        for(int j=1;j<=h;++j)
            scanf("%lf",&p[i][j]);
    double sum=w[1][1];
    f[1][1]=1,g[1][1]=w[1][1];
    for(int i=1;i<=l;++i)
        for(int j=1;j<=h;++j){
            if(i==1&&j==1)continue;
            f[i][j]=f[i][j-1]*p[i][j-1]+f[i-1][j]*(1.0-p[i-1][j]);
            sum+=(g[i][j]=f[i][j]*w[i][j]);
            g[i][j]+=max(g[i-1][j],g[i][j-1]);
        }
    printf("%.0lf",sum-k*g[l][h]);
    return 0;
}

2018.08.30 花园(期望dp)的更多相关文章

  1. 2018&period;08&period;30 bzoj4318&colon; OSU&excl;(期望dp)

    传送门 简单期望dp. 感觉跟Easy差不多,就是把平方差量进阶成了立方差量,原本维护的是(x+1)2−x2" role="presentation" style=&qu ...

  2. 2018&period;08&period;30 Tyvj1952 Easy(期望dp)

    Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连 ...

  3. 2018&period;08&period;30 bzoj4720&colon; &lbrack;Noip2016&rsqb;换教室(期望dp)

    传送门 一道无脑的期望dp. 用f[i][j][0/1]表示前i堂课提出了j次申请且第i堂课没有(有)提出申请. 这样就可以状态转移了. 然而这题状态转移方程有点长... (主要是情况多... 代码: ...

  4. 2018&period;08&period;30 游戏(概率dp)

    题目描述 Alice 和 Bob 两个人正在玩一个游戏,游戏有很多种任务,难度为 p 的任务(p是正整数),有 1/(2^p) 的概率完成并得到 2^(p-1) 分,如果完成不了,得 0 分.一开始每 ...

  5. 2018&period;08&period;19 NOIP模拟 dp(二分&plus;状压dp)

    Dp 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 一块土地有 n 个连续的部分,用 H[1],H[2],-,H[n] 表示每个部分的最初高度.有 n 种泥土可用,他们都能覆盖连续 ...

  6. 2018&period;08&period;30 NOIP模拟 graph(dfs序&sol;树剖&plus;线段树)

    [描述] 给你一个图,一共有 N 个点,2*N-2 条有向边. 边目录按两部分给出 1. 开始的 n-1 条边描述了一颗以 1 号点为根的生成树,即每个点都可以由 1 号点 到达. 2. 接下来的 N ...

  7. 2018&period;08&period;30 NOIP模拟 kfib(矩阵快速幂&plus;exgcd)

    [输入] 一行两个整数 n P [输出] 从小到大输出可能的 k,若不存在,输出 None [样例输入 1] 5 5 [样例输出] 2 [样例解释] f[0] = 2 f[1] = 2 f[2] = ...

  8. 2018&period;08&period;30 NOIP模拟 wall(模拟)

    [问题描述] 万里长城是中国强大的标志,长城在古代的用途主要用于快速传递军事消息和抵御 外敌,在长城上的烽火台即可以作为藏兵的堡垒有可以来点燃狼烟传递消息. 现在有一段 万里长城,一共有 N 个烽火台 ...

  9. 2018&period;08&period;30 21&colon;12 第一个Django程序完成

    from django.http import HttpResponse def hello(request): return HttpResponse("Hello world ! &qu ...

随机推荐

  1. vue&period;js几行实现的简单的todo list

    序:目前前端框架如:vue.react.angular,构建工具fis3.gulp.webpack等等...... 可谓是五花八门,层出不穷,眼花缭乱...其实吧只要你想玩还是可以玩玩的..下面是看了 ...

  2. avascript中的this与函数讲解

    徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...

  3. mongodb配置文件&period;conf

    启动方式 ./bin/mongod -f MongoDB.conf 会看到 about to fork child process, waiting until server is ready for ...

  4. java &plus; jquery &plus; ajax &plus; json 交互

    前端js部分: $.ajax({ async:true, cache:false, type:"POST", dataType : 'json', url:"/shopp ...

  5. MapReduce&colon; 一个巨大的倒退

    前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce 技术的文章, ...

  6. Hibernate中的session对象update方法的使用

    使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...

  7. 初学者学Java(十五)

    再谈数组 在这一篇中我们来讲一下关于数组的排序和查找的方法. 排序 说到数组的排序,就不得不说冒泡这种经典的方法. 1.冒泡排序 冒泡排序的基本思想是比较两个相邻元素的值,如果满足条件就交换元素的值( ...

  8. USB HID介绍

    HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容. USB设备描述符-概述 当插入USB设备后,主机会向设备请求各种描述符来识别设备.那什么是设 ...

  9. HTML5的自定义属性data-&ast;详细介绍和JS操作实例

    当然高级浏览器下可通过脚本进行定义和数据存取.在项目实践中非常有用. 例如: 复制代码 代码如下: <div id = "user" data-uid = "123 ...

  10. Ubuntu 完全卸载MySQL 重装步骤

    sudo rm /var/lib/mysql/ -R 删除mysql的数据文件   sudo rm /etc/mysql/ -R 删除mqsql的配置文件   sudo apt-get autorem ...