您的位置:首页 > 其它

hdu--4336--概率dp

2014-11-27 13:18 302 查看
其实 概率dp最后得到的期望 你是 顺序递推 还是 逆序递推 就是取决于你对于 dp[x]这个数组是如何去定义的

这边 逆序递推的 思想 可以去看下

    传送 感觉这篇博客下方的评论 讲得还可以

至于顺序递推的 可以参照下 porker给我的这个公式

#include <iostream>
#include <iomanip>
using namespace std;

int n;
const int size = 25;
double p[size];
double dp[1<<size];

void solve( )
{
double sum , sumP;
for( int i = 1 ; i<=(1<<n)-1 ; i++ )
{
sum = sumP = 0;
for( int j = 0 ; j<n ; j++ )
{
if( ( i & (1<<j) ) == 0 )
{
continue;
}
sum += p[j] * dp[ i ^ (1<<j) ];
sumP += p[j];
}
dp[i] = ( sum + 1.0 ) / sumP;
}
}

int main()
{
cin.sync_with_stdio(false);
while( cin >> n )
{
for( int i = 0 ; i<n ; i++ )
{
cin >> p[i];
}
dp[0] = 0;
solve( );
cout << setiosflags(ios::fixed);
cout << setprecision(5) << dp[(1<<n)-1] << endl;
}
return 0;
}


View Code
他们实在很相似 就是定义与转移的区别 想起来 真的狠头痛 ..;

这边 在放一个XX论文的题目 但他那边没给出状态转移 我这边也写下

„„在2003年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字,就可以参加百事世界杯之旅的抽奖活动,获取球星背包、随身听,更可以赴日韩观看世界杯。还不赶快行动!„„” 你关上电视,心想:假设有n个不同球星的名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢?

dp[0] = 0

dp[x] = (n-x)/n*dp[x] + x/n*dp[x-1]+1

dp[x] = dp[x-1]+n/x;

dp(0)=0
dp(1)=dp(0)+n/1
dp(2)=dp(1)+n/2
.....
dp(n)=dp(n-1)+n/n

可以得到dp
= n * (1/1+1/2+1/3+...1/n)

或者

dp
=0

dp[x] = x/n*dp[x]+(n-x)/n*dp[x+1]+1

dp[x] = dp[x+1]+n/(n-x)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: