题目描述:

小 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 。

输出格式:

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

INPUT

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

OUTPUT

161

题目分析:

期望概率\(dp\),学这个的时候对期望概率理解得还不深刻基本没理解好吧,所以不懂的地方很多,可能讲得比较细

遇到期望概率\(dp\):



(来自\(linners\))

首先我们很明显可以想到的是,每个节点的状态是可以从它左边和上面转移过来的。想到这一点,状态转移方程就好设计了。

容易有\(f[i][j] = f[i - 1][j] * (1 - p[i - 1][j]) + f[i][j - 1] * p[i][j - 1]\),然后这个\(f\)数组处理出来的是概率,每次把不干净值乘上去再累加到\(ans\)上并一直递推下去

然后发现,如果没有小\(B\)这个人的话,其实我们的问题就已经搞定了所以为什么小B这么事儿多,直接输出

如果有的话,考虑在期望图上再做一次\(dp\)记录转移过来的当前最长链并累加起来,最后在答案上减去即可

这里说一下为什么要在期望图上做\(dp\)而非在原不干净值的图上做\(dp\)(对这个理解不深刻,卡的很久):

如果在原图上做\(dp\),相当于忽略了期望带来的影响。形象地讲,假设我们打扫了一个很脏很脏的格子,然后这个人有百万分之一的概率去踩这个格子

……那我可打扫个毛线啊!不如打扫一个相对比较脏,踩的几率更大的格子

而期望的本质是每种事件发生对答案贡献的加权平均,在期望图(即贡献的加权平均图上)跑一遍\(dp\)找出小\(B\)清理的最优策略,这个最优策略本质上是对答案影响最大(减少最多)的贡献的加权平均,不然数学意义都不一样怎么相减呢。

代码:

#include<bits/stdc++.h>
#define N (1000 + 5)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + c - '0'; c = getchar();}
return cnt * f;
}
int l, h, k;
double c[N][N], f[N][N], p[N][N];
int d[N][N];
double sum;
signed main(){
memset(c, 0, sizeof(c));memset(p, 0, sizeof(p));
memset(f, 0, sizeof(f));memset(d, 0, sizeof(d));
l = read(), h = read(), k = read();
for (register int i = 1; i <= l; i++)
for (register int j = 1; j <= h; j++)
d[i][j] = read(); for (register int i = 1; i <= l; i++)
for (register int j = 1; j <= h; j++)
scanf("%lf", &p[i][j]);
sum = d[1][1];
c[1][1] = d[1][1];
f[1][1] = 1;
for (register int i = 1; i <= l; i++)
for (register int j = 1; j <= h; j++) {
if (i == 1 && j == 1) continue;
f[i][j] = f[i - 1][j] * (1 - p[i - 1][j]) + f[i][j - 1] * p[i][j - 1];
c[i][j] = f[i][j] * d[i][j];
c[i][j] += max(c[i - 1][j], c[i][j - 1]);
sum += f[i][j] * d[i][j];
}
if (!k) return printf("%.0lf",sum), 0;
printf("%.0lf", sum - c[l][h]);
return 0;
}

花园【SCOI2017期望DP入门题】的更多相关文章

  1. 2018.08.30 花园(期望dp)

    题目背景 SCOI2017 DAY2 T1 题目描述 小 A 的花园的长和宽分别是 L,H .小 A 喜欢在花园里做游戏.每次做游戏的时候,他都先把花园均匀分割成 L×H 个小方块,每个方块的长和宽都 ...

  2. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  3. 【dp入门题】【跟着14练dp吧...囧】

    A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...

  4. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  5. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  6. 期望dp好题选做

    前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...

  7. HDU 2089 不要62【数位DP入门题】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  9. HDU3853 LOOPS 期望DP基础题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 题目大意(只是大意,名字什么的可能和原题描述不一样~): 爱丽丝与华容道 题目描述 爱丽丝是一个 ...

随机推荐

  1. 函数的属性和方法, apply和call的区别及bind的使用

    ==>我的新博客中 http://www.suanliutudousi.com/2017/08/27/%E5%87%BD%E6%95%B0%E7%9A%84%E5%B1%9E%E6%80%A7% ...

  2. uoj21 【UR #1】缩进优化

    题目 题意简介明了,需要找到一个\(T\),最小化 \[\sum_{i=1}^n\left \lfloor \frac{a_i}{T} \right \rfloor+\sum_{i=1}^na_i\% ...

  3. 2016CCPC杭州现场赛 B-Bomb /// tarjan缩点

    题目大意: 给定n个爆破点的信息 x y r w 表示爆破点位置为 (x,y) 爆破范围是以位置为圆心 半径为r的圆 引爆这个点的代价为w 引爆某个点时 其他位置在该爆破范围内的爆破点也会被引爆 求引 ...

  4. linux下使用自带mail发送邮件

    linux下使用自带mail发送邮件 mailx工具说明: linux可以通过安装mailx工具,mailx是一个小型的邮件发送程序,一般可以通过该程序在linux系统上,进行监控linux系统状态并 ...

  5. Mysql优化-概述

    摘抄并用于自查笔记 为什么要优化 一个应用吞吐量瓶颈往往出现在数据库的处理速度上. 随着应用程序的使用,数据库数据逐渐增多,数据库处理压力逐渐增大. 关系型数据库的数据是存放在磁盘上,读写速度慢(与内 ...

  6. kaggle 实战 (1): PCA + KNN 手写数字识别

    文章目录 加载package read data PCA 降维探索 选择50维度, 拆分数据为训练集,测试机 KNN PCA降维和K值筛选 分析k & 维度 vs 精度 预测 生成提交文件 本 ...

  7. CTR预估的常用方法

    1.CTR CTR预估是对每次广告的点击情况做出预测,预测用户是点击还是不点击. CTR预估和很多因素相关,比如历史点击率.广告位置.时间.用户等. CTR预估模型就是综合考虑各种因素.特征,在大量历 ...

  8. Leetcode973. K Closest Points to Origin最接近原点的K个点

    我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...

  9. Trip

    Trip 给出一个长度为n序列\(\{a_i\}\),长度为m的序列\(\{b_i\}\),求它们的不同lcs序列按字典序输出,\(n,m\leq 80\),lcs不超过1000个,字符为26个小写字 ...

  10. Jmeter插件:jp@gc - Dummy Sampler

    Dummy Sampler可以比较方便地模拟测试场景,自定义Request Data和Response Data 1. 安装插件:打开页面插件管理网站,下载plugins-manager.jar. 在 ...