【期望DP】

【总览】

【期望dp】

  求解达到某一目标的期望花费:因为最终的花费无从知晓(不可能从$\infty$推起),所以期望dp需要倒序求解。

  设$f[i][j]$表示在$(i, j)$这个状态实现目标的期望值(相当于是差距是多少)。

首先$f[n][m] = 0$,在目标状态期望值为0。然后$f = (\sum f' × p) + w $,$f'$为上一状态(距离目标更近的那个,倒序),$p$为从$f$转移到$f'$的概率(则从$f'$转移回$f$的概率也为$p$),w为转移的花费。

最后输出初始位置的$f$即可。

 

特别的,当转移关系不成环时,期望dp可以线性递推。

但当转移关系成环时,期望dp的最终状态相当于一个已知量,而转移关系相当于一个个方程,可以使用【高斯消元】解决。

“高斯消元期望dp的例题”

【概率dp】

  概率dp通常已知初始的状态, 然后求解最终达到目标的概率,所以概率dp需要顺序求解。

  概率dp相对简单,当前状态只需加上所有上一状态乘上转移概率即可:$f = \sum f'_{i} × p_{i}$

【例题】

【hdu3853】Loops

  简单的期望dp题,设$f[i][j]$表示当前位置到达终点的期望体力,则$f[r][c] = 0$。

  已知每个位置不动、向下、向右的概率。设p0为当前状态下停留的概率,p1为向下的概率,p2为向右的概率,那么就从终点开始逆推:

$$f[i][j] = p0 × f[i][j] + p1 × f[i + 1][j] + p2 × f[i][j +1] + 2$$

  dp强调根据已知推未知,发现等号右边$f[i][j]$正是我们要求的,呢么这就可以构成一个方程了。不过没有那么复杂,因为转移关系不是一个环,只要我们将右边的$f[i][j]$移到左边,再将系数除过去,等号右边就都是已知的了。

【CODE】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;const int R = 1005, C = 1005;
const double eps = 1e-5;
int r, c;
double p[R][C][3];
double f[R][C];int main(){while(scanf("%d%d", &r, &c) != EOF){memset(p, 0, sizeof p);memset(f, 0, sizeof f);for(int i = 1; i <= r; i++)for(int j = 1; j <= c; j++)scanf("%lf%lf%lf", &p[i][j][0], &p[i][j][1], &p[i][j][2]);f[r][c] = 0;for(int i = r; i >= 1; i--)for(int j = c; j >= 1; j--){if(i == r && j == c) continue;if(fabs(1.0 - p[i][j][0]) < eps) continue;f[i][j] = (p[i][j][1] * f[i][j + 1] + p[i][j][2] * f[i + 1][j] + 2.0) / (1.0 - p[i][j][0]);}printf("%.3f\n", f[1][1]);}return 0;
}
View Code

【hdu4405】AeroplaneChess

  又是一道期望dp。读题可知终点落在$n$~ $n + 5$,将它们的f全部置为$0$。

  因为有直接跳转,所以如果当前点有可以直接跳转到的点,那么这次是不用掷骰子的,因为当前期望等于目标点的期望。

  然后考虑掷色子,摇到$1, 2, 3, 4, , 6$的概率都为$\frac{1}{6}$,所以$f[i] = \sum_{x = 1}^{6} f[i + x] × \frac{1}{6} + 1$

  这样倒序dp便可以得到期望值。

【CODE】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;const int N = 100050;
int go[N];
int n, m;
double f[N];int main(){while(~scanf("%d%d", &n, &m), n + m){memset(go, -1, sizeof go);for(int i = 1; i <= m; i++){int x, y; scanf("%d%d", &x, &y);go[x] = y;}memset(f, 0, sizeof f);for(int i = n - 1; i >= 0; i--){if(go[i] != -1){f[i] = f[go[i]];continue;}f[i] = (f[i + 1] + f[i + 2] + f[i + 3] + f[i + 4] + f[i + 5] + f[i + 6]) / 6 + 1;}printf("%.4f\n", f[0]);}return 0;
}
View Code

 【poj2096】收集错误

  这道题很有意思。设$f[i][j]$为收集到$i$种bug,属于$j$个子系统的期望天数,同样$f[n][s] = 0$

  考虑当前bug:

  •  属于已经收集到的$i$种,也属于已经收集到的$j$个系统,概率为$\frac{i × j}{n × s}$
  •     属于已经收集到的$i$种,属于新的一套系统, 概率为$\frac{i × (s - j)}{n × s}$
  •    属于新的一种,属于已经收集到的$j$个系统,概率为$\frac{(n - i) × j}{n × s}$
  •     属于新的一种,属于新的系统,概率为$\frac{(n - i) × (s - j)}{n × s}$

上面顺推求出的概率,应该是等于逆推的概率的。

其余的就很基础了。

【CODE】

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;const int N = 1005, S = 1005;
double f[N][S];
int n, s;int main(){scanf("%d%d", &n, &s);f[n][s] = 0.0;for(int i = n; i >= 0; i--){for(int j = s; j >= 0; j--){if(n * s - i * j == 0) continue;double c1 = (double)i * ((double)s - (double)j), c2 = ((double)n - (double)i) * (double)j, c3 = ((double)n - (double)i) * ((double)s - (double)j), c4 = (double)n * (double)s, c5 = (double)n * (double)s - (double)i * (double)j;f[i][j] = ((c1 * f[i][j + 1] + c2 * f[i + 1][j] + c3 * f[i + 1][j + 1] + c4) / c5);}}printf("%.4f\n", f[0][0]);return 0;
}
View Code

 【poj3071】FootBall

  终于到概率dp了。设$f[i][j]$表示当前第$i$轮比赛,$j$队获胜的概率,那么他如果想获胜:

  • 首先上一轮比赛他必须获胜。
  • 然后他的对手上一轮必须获胜。
  • 他的对手只能是相邻的。

  判断相邻十分巧妙的使用了二进制:如果把所有队伍的编号都$-1$:

  从$0$开始的自然数(二进制):$0, 1, 10, 11, 100, 101, ......$

  可以发现相邻的数它们的最后一位一定相反。

  进行第一轮比赛后,相当于将相邻俩个节点替换成他们的父节点$(k >> 1)即将最后一位去掉$,此时相邻的点仍然符合规律。

  所以我们判断两队是否能比赛的标准就是:$(j >> (i - 1)) $ ^ $1 == k >> (i - 1)$

【CODE】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;const int N = 8;
int n;
double f[N][300], p[300][300];int main(){freopen("h.in", "r", stdin);while(scanf("%d", &n), n != -1){memset(p, 0, sizeof p);memset(f, 0, sizeof f);for(int i = 1; i <= (1 << n); i++){f[0][i] = 1;for(int j = 1; j <= (1 << n) ; j++)scanf("%lf", &p[i][j]);}for(int i = 1; i <= n; i++)for(int j = 1; j <= (1 << n); j++)for(int k = 1; k <= (1 << n); k++)if((((j - 1) >> (i - 1)) ^ 1) == ((k - 1) >> (i - 1)))f[i][j] += f[i - 1][k] * f[i - 1][j] * p[j][k];double ans = -1;int ret = 0;for(int i = 1; i <= (1 << n); i++)if(ans < f[n][i]) ans = max(ans, f[n][i]), ret = i;printf("%d\n", ret);}
}
View Code

转载于:https://www.cnblogs.com/CzYoL/p/7220088.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复习HTML CSS(2)

n 项目符号嵌套编号思路 标签的内容&#xff08;文本、项目符号、表格、图片等&#xff09;必须放在最底层标记中。 n 图片标记&#xff08;行内元素&#xff0c;单边标记&#xff09; l 语法&#xff1a;<img 属性 “值”> l 常用属性 Width&#xff1a;图片宽…

Spring MVC:使用基于Java的配置创建一个简单的Controller

这是我博客上与Spring MVC相关的第一篇文章。 开端总是令人兴奋的&#xff0c;因此我将尽量简洁明了。 Spring MVC允许以最方便&#xff0c;直接和快速的方式创建Web应用程序。 开始使用这项技术意味着需要Spring CORE的知识。 在文章中&#xff0c;您将了解有关创建简单的Spri…

2、创建分类器笔记

创建分类器 简介&#xff1a;分类是指利用数据的特性将其分类成若干类型的过程。分类与回归不同&#xff0c;回归的输出是实数。监督学习分类器就是用带标记的训练数 据建立一个模型&#xff0c;然后对未知的数据进行分类。分类器可以实现分类功能的任意算法&#xff0c;最简单…

复习上学期的HTML CSS(1)

自己跟着网上教程复习上学期的HTML CSS&#xff0c;因为已经忘得差不多了&#xff0c;而且现在学的js也要以HTML CSS为基础&#xff0c;坚持每天持续更新。 n B/S 网络结构 Browser/Server 浏览器/服务器&#xff0c;这是现在最流行的网络模式。如新浪网、凤凰网等。 C/S Clie…

星战前夜服务器维护时间,EVE星战前夜开测时间在什么时候 什么时候测试

EVE星战前夜什么时候开测&#xff0c;EVE星战前夜的测试时间在什么时候&#xff0c;想要知道EVE星战前夜测试时间的小伙伴一起来看看EVE星战前夜的相关资讯&#xff0c;了解一下游戏的开测时间吧。EVE星战前夜目前仍在开发阶段&#xff0c;目前没有进行大范围的测试&#xff0c…

3、预测模型笔记

预测模型 1、简介 预测建模&#xff08;Predictive modeling&#xff09;是一种用来预测系统未来行为的分析技术&#xff0c;它由一群能够识别独立输入变量与反馈目标关联关系的算法构成。根据观测值创建一个数学模型&#xff0c;然后用这个模型去预测未来发生的事情。 预测模型…

常见问题_智能切膜机常见问题

hoco.智能切膜机&#xff0c;如果使用了错误方式&#xff0c;会导致操作失误&#xff0c;整理4个常见问题&#xff0c;还有错误示范&#xff0c;请跟随视频去了解&#xff0c;你使用正确了吗?1. 膜切反这个需要留意切割膜的正反&#xff0c;有文字面就是正面&#xff0c;无文字…

bootstrap的栅格系统和响应式工具

关于bootstrap的响应式布局&#xff0c;昨天看了杨老师的视频教学https://www.bilibili.com/video/av18357039豁然开朗&#xff0c;在这里记录一下 一&#xff1a;meta标签的引用 <meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…

小熊错误_新手爸妈第一年带娃时,很容易犯的7个错误,对照看看你中了没

文 /关注小熊育儿&#xff0c;帮您轻松育儿带娃不是一件容易的事&#xff0c;对爸妈的时间和体力都是一种考验&#xff0c;不仅“熊孩子”让人头疼&#xff0c;育儿知识差&#xff0c;不懂科学育儿理念的“熊爸妈”也是让人很无奈的&#xff0c;最终受伤的还是孩子&#xff0c;…

python--装饰器、生成器、迭代器、元类

一、装饰器 def w1(func):def inner():func()return innerw1 def f1():print(1111111) 1.只要python解释器执行到装饰器&#xff0c;就会自动进行装饰&#xff0c;而不是等到调用的时候才进行装饰。 2.有参数的函数&#xff0c;装饰器定义方法 def w1(func):def inner(*args, *…

scss的使用方式(环境搭建)

我用的是Koala。 IDE是intellij_idea&#xff08;其他IDE也可&#xff09; 下载Koala&#xff1a;http://koala-app.com/ 2.安装&#xff08;选好位置&#xff0c;下一步即可&#xff09; 3.打开Koala&#xff0c;创建项目 》创建css文件夹》创建XXX.scss文件&#xff0c;拖到…

小程序 按需_小程序想要留住用户需哪些举措?

**当下许多企业在进行长沙小程序开发后&#xff0c;都会费劲心思在推广引流上&#xff0c;很多企业也确实起到了不错的效果&#xff0c;用户们也是纷纷来到企业的小程序中。只不过有的小程序却无法将用户留下来&#xff0c;导致用户流失&#xff0c;令推广付之东流。下面长沙小…

渍渍渍~来一发豆瓣自动登录玩玩~

今天来一个比较屌的自动化登陆工具&#xff0c;selenium模块&#xff0c;这个模块&#xff0c;比较装逼啦~具体自行百度吧&#xff01;这篇博客实现了什么功能呢~可以自动使用用户名和密码登录&#xff0c;当然&#xff0c;豆瓣对登录次数还有ip地址做了一些策略&#xff0c;例…

Redis数据库入门学习(下载与安装、常用命令、在Java中操作Redis)

简介 下载与安装 数据类型 常用命令 1.字符串操作命令 2.哈希操作命令 3.列表操作命令 push是将元素总是插入到第一个 0表示第一个&#xff0c;1表示第二个。-1表示倒数第一个&#xff0c;-2表示倒数第二个。当前命令的意思是第一个到倒数第一个&#xff0c;即就是全部元素 rpo…

.NET使用Office Open XML导出大量数据到 Excel

我相信很多人在做项目的都碰到过Excel数据导出的需求&#xff0c;我从最开始使用最原始的HTML拼接&#xff08;将需要导出的数据拼接成TABLE标签&#xff09;到后来happy的使用开源的NPOI, EPPlus等开源组件导出EXCEL&#xff0c;但不久前&#xff0c;我在一个项目碰到一个需求…

CSS自定义消息提示

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#confirm{position: absolute;z-index: 1;display: inline-block;border: 1px solid black;backgr…

file 选择的文件胖多有多大_如何删除 macOS 压缩包中的隐藏文件?

如何删除 macOS 压缩包中的隐藏文件&#xff1f;在工作中&#xff0c;压缩打包文件是不可缺少的一项工作。为了避免文件的损坏和缺失&#xff0c;我们通常在macOS系统中&#xff0c;把多个文件或文件夹压缩后进行传输&#xff0c;我们一般使用访达&#xff08;Finder&#xff0…

CSS画各种二维图形

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#triangle_top{display: inline-block;width:0;height:0;border-left:50px solid transparent;bor…

数据库的开启与关闭

今天&#xff0c;为了一些原因&#xff0c;要重启数据库&#xff0c;但因为当时安装的时候&#xff0c;同学随便装了&#xff0c;导致很多文件都找不到&#xff0c;想使用绝对路径重启数据的计划卡死在了路上。以下&#xff0c;我写下我的数据库开启、关闭的方法&#xff0c;方…

leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?

推荐观看&#xff1a;java技术进阶&#xff1a;膜拜&#xff01;字节大神总结的666页大师级算法宝典&#xff0c;分分钟团灭LeetCode​zhuanlan.zhihu.com2020最新马士兵老师联手左程云老师丨数据结构与算法丨面试BATJ必备​www.bilibili.com我是大二的时候开始接触LeetCode的&…