zoukankan      html  css  js  c++  java
  • BZOJ 4008 亚瑟王(概率DP 奥妙重重)

    题意

    中文题面,就不解释了


    分析

    显然这道题直接求期望太麻烦,想想转化问题(这转化太神了)。
    定义f(i,j)f(i,j)表示第ii张卡总共被经过jj次的概率,有转移方程式
    f(i,j)=f(i1,j)(1pi1)j+f(i1,j+1)(1(1pi1)j+1)large f(i,j)=f(i-1,j)*(1-p_{i-1})^j+f(i-1,j+1)*(1-(1-p_{i-1})^{j+1})最终答案就是
    i=1nj=1rf(i,j)(1(1p[i])j)dilarge sum_{i=1}^nsum_{j=1}^rf(i,j)*(1-(1-p[i])^j)*d_i

    在这里插入图片描述
    .-.-

    AC CODE
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 250;
    const int MAXM = 150; 
    double p[MAXN], d[MAXN], f[MAXN][MAXM], mul[MAXN][MAXM];
    int main () {
    	int T, n, m;
    	scanf("%d", &T);
    	while(T--) {
    		scanf("%d%d", &n, &m);
    		for(int i = 1; i <= n; ++i) {
    			scanf("%lf%lf", &p[i], &d[i]);
    			mul[i][0] = 1;
    			for(int j = 1; j <= m; ++j)
    				mul[i][j] = mul[i][j-1] * (1-p[i]);
    		}
    		memset(f, 0, sizeof f);
    		f[1][m] = 1; double ans = 0;
    		for(int i = 1; i <= n; ++i)
    			for(int j = m; j >= 1; --j) {
    				if(!(i == 1 && j == m))
    					f[i][j] = f[i-1][j] * mul[i-1][j] + f[i-1][j+1] * (1-mul[i-1][j+1]);
    				ans += f[i][j] * (1-mul[i][j]) * d[i];
    			}
    		printf("%.10lf
    ", ans);
    	}
    }
    

    TIP:预处理幂快的多

  • 相关阅读:
    linux c/c++ 获取文件大小
    android 打开各种文件(setDataAndType)
    Android framework系统默认设置修改
    android的 root权限
    [Power]待机电流问题,如何查找wakelock
    Android.mk for your own module
    通过adb 发送广播
    ubuntu下minicom的安装及使用
    ubuntu 下使用 putty 调试
    Android平台Overlay机制
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12039431.html
Copyright © 2011-2022 走看看