概率期望dp
Ren_Ivan
衡中oier,fight for furture
展开
-
bzoj 1076 奖励关 状压+期望dp
因为每次选择都是有后效性的,直接dp肯定不行,所以需要逆推。 f[i][j]表示从第i次开始,初始状态为j的期望收益 #include #include #include using namespace std; int bit[18],K,n,aa,ned[18],a[18]; double f[105][1<<17]; int main() { bit[0]=1; for(int i=原创 2017-07-09 19:47:39 · 314 阅读 · 0 评论 -
bzoj 4008 亚瑟王 期望概率dp
对于这种看起来就比较傻逼麻烦的题,最关键的就是想怎么巧妙的设置状态数组,使转移尽可能的简洁。 一开始我想的是f[i][j]表示到第j轮第i张牌还没有被选的概率,后来发现转移起来特别坑爹,还会有重的或漏的情况。 于是改变想法:f[i][j]表示考虑到前i张牌,还剩j轮的概率 转移也就简单了,下一张牌有两种可能,选或不选: f[i+1][j]=f[i][j]*(1-p[i+1])^j f[原创 2017-07-09 17:28:19 · 365 阅读 · 0 评论 -
bzoj 4318 OSU 概率期望dp
可以发现:f[i]转移到f[i+1]只和最后一串1的长度和平方有关, 因为如果新加的位置是1,贡献就是(x+1)^3-x^3=3x^2+3x+1,否则为0; 所以对于每一个位置,处理出期望的f,x和x^2(x表示最后一串1的长度)即可 #include #define N 100100 int n; double a1[N],a2[N],f[N],p[N]; int main(){原创 2017-07-22 14:03:04 · 242 阅读 · 0 评论 -
bzoj 4832 抵制克苏恩 概率期望dp
考试时又翻车了..... 一定要及时调整自己的思路!!! 随从最多有7个,只有三种,所以把每一种随从多开一维 so:f[i][j][k][l]为到第i次攻击前,场上有j个1血,k个2血,l个3血随从的概率 最后利用期望的可加性都加起来就好了 ps.30滴血受到四五十伤害,完全tm不符合逻辑啊,mdzz!!! #include #include #include #include #in原创 2017-07-31 15:07:33 · 387 阅读 · 0 评论 -
bzoj 1426 收集邮票
f[i]:当前已拥有i种邮票,还需要买的邮票数的期望值。 g[i]:当前已拥有i种邮票,还需要的钱的期望值。 每张邮票初始都是1元钱,每买一张邮票,还没购买的邮票每张都涨价1元。 f[i]=1+(n-i)/n*f[i+1]+i/n*f[i] --->>f[i]=f[i+1]+n/(n-i) g[i]=1+(n-i)/n*(g[i+1]+f[i+1])+i/n*(g[i]原创 2017-07-27 12:22:25 · 287 阅读 · 0 评论 -
bzoj 2510 弱题 矩阵乘
看题就像矩阵乘 但是1000的数据无从下手 打表发现每一行的数都是一样的,只不过是错位的,好像叫什么循环矩阵 于是都可以转化为一行的,O(n3)->O(n2)*logk#include #include #include #include #include using namespace std; int n,m,k,yy[1005][1005]; double ma[1005],A[100原创 2017-07-27 20:02:11 · 298 阅读 · 0 评论