这题 to[i][j] 为第i个人送j这个礼物的概率 我们用13进制进行压缩这个留下的的礼物的个数,这样我们将dp[i][k]表示为当第i个人放完礼物后得到的状态为k时的概率,那么通过记忆化搜索我们就得到了我们想要的状态概率即 dp[i][k]+={dp[i+1][k-aj]*to[i][aj]},好那么现在如果我去拿第一个礼物我正确的概率,我们 可以先知道好朋友放第一个的概率为

假设S为最初礼物的状态

pop=dp[1][S-a1]*to[0][1]/dp[0][S],这个是好朋友送了第一个礼物的概率,那么现在对于第一种礼物他有digit【0】个我们需要有1/digit[0]的概率去得到这个礼物,以此类推去得到第1个第2个等等。。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=;
const int MAXM=****+;
int gift[maxn],n;
double dp[][MAXM],to[][maxn];
bool vis[][MAXM];
int A[maxn];
double dfs(int loc, int G){
if(vis[loc][G]) return dp[loc][G];
int K=G;
for(int i=; i>=; --i)
{
A[i] = K% ; K /= ;
}
double ans=;
for(int i=; i<; ++i)
if( A[i] ){
A[ i ]--;
K = ;
for( int j = ; j< ; ++ j )
K = K * + A[ j ] ;
ans+=dfs( loc + , K ) * to[ loc ][ i ] ;
A[i]++;
}
vis[loc][G]=true;
return dp[loc][G]=ans;
}
int main()
{
int cas;
scanf("%d",&cas);
while( cas -- ){
scanf("%d",&n);
for(int i=; i<; ++i)
scanf("%d",&gift[i]);
for(int i=; i<n; ++i)
for(int j=; j<; ++ j)
scanf("%lf",&to[i][j]);
memset(dp,,sizeof(dp));
memset(vis,false,sizeof(vis));
vis[n][]=;
dp[n][]=;
int k=;
for(int i=;i<; ++i ){
k=k*+gift[i];
}
double res=dfs(,k);
int ans=;
double pans=-;
for(int i=; i<; ++i)if(gift[i]){
gift[i]--;
k=;
for(int j=; j<; ++j)
k=k*+gift[j];
gift[i]++;
double a=dp[][k]*to[][i]/gift[i]/res;
if(a>pans){
ans=i+; pans=a;
}
}
printf("%d %.3lf\n",ans,pans);
}
return ;
}

uva10417 概率DP的更多相关文章

  1. Codeforces 28C [概率DP]

    /* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队 ...

  2. HDU 4405 Aeroplane chess (概率DP)

    题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i  这个位置到达 n ...

  3. POJ 2096 Collecting Bugs (概率DP)

    题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...

  4. POJ 2151 Check the difficulty of problems (概率DP)

    题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...

  5. 概率DP light oj 1030

    t组数据 n块黄金 到这里就捡起来 出发点1 到n结束  点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6  如果满6个的话 否则 ...

  6. hdu 4050 2011北京赛区网络赛K 概率dp ***

    题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...

  7. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

  8. SGU 422 Fast Typing(概率DP)

    题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...

  9. HDU 4050 wolf5x(动态规划-概率DP)

    wolf5x Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. php开n次方

    php有开平方函数 sqrt,但没开n次方的函数 网上用根据什么数字原理,可用次方(pow)弄开方,格式为:pow(number, 1/ 开方数) 例如: 4的开平方,可以写成 pow(4, 1/2) ...

  2. shell基础篇(十)shell脚本的包含

    前记 写到这里:shell中基础差不多已经讲完了.希望你已经对shell有了一个基本了解.你可能跃跃欲试,要写一些程序练习一下.这会对你很有好处.建议大家去chinaunix去学习:我是li0924. ...

  3. 【RF库Collections测试】Get Slice From List

    Name:Get Slice From ListSource:Collections <test library>Arguments:[ list_ | start=0 | end=Non ...

  4. ELK5.X+logback搭建日志平台

    一.背景 当生产环境web服务器做了负载集群后,查询每个tomcat下的日志无疑是一件麻烦的事,elk为我们提供了快速查看日志的方法. 二.环境 CentOS7.JDK8.这里使用了ELK5.0.0( ...

  5. shell、cmd、dos和脚本语言杂谈(转)

    问题一:DOS与windows中cmd区别   在windows系统中,“开始-运行-cmd”可以打开“cmd.exe”,进行命令行操作. 操作系统可以分成核心(kernel)和Shell(外壳)两部 ...

  6. ecplise部署gradle web项目

    gradle项目结构图: build.gradle apply plugin: 'java' apply plugin: 'war' //用来生成war apply plugin: 'eclipse- ...

  7. Swift-Swift的Singleton三种写法

    第一种: import Foundation class SingletonA : NSObject { static let sharedInstance: SingletonA = Singlet ...

  8. c/c++左值和右值

    C/C++中的变量有左值和右值之分,他们的区别主要如下: (1)左值可以放在赋值号 = 的左右两边,右值只能放在赋值号 = 的右边 (2)在C语言中,有名字的变量即为左值:而函数的运行结果或表达式中间 ...

  9. IT English Collection(20) of Object modeling

    1 前言 本节简单的介绍了对象建模,以及需要注意的事项. 2 详述 2.1 原文 Objectmodeling is the process of designing the objects or c ...

  10. java基础---->多线程之Runnable(一)

    java线程的创建有两种方式,这里我们通过简单的实例来学习一下.一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活. java中多线程的创建 一.通过继承Thread类来创建多线程 pu ...