[SCOI2008]奖励关(期望dp)

P2473 [SCOI2008] 奖励关

期望dp第四题。

不难想到 d p [ i ] [ x ] dp[i][x] dp[i][x]表示 抛 出 宝 物 i 次 且 状 态 为 x 的 收 益 抛出宝物i次且状态为x的收益 ix

但是试图从前往后转移是行不通的

为 什 么 呢 ? 为什么呢? ?

本 状 态 转 移 给 下 一 个 状 态 , 给 每 个 状 态 都 是 均 分 为 1 n 本状态转移给下一个状态,给每个状态都是均分为\frac{1}{n} ,n1

但 是 前 面 的 状 态 转 移 给 自 己 时 , 却 不 一 定 以 1 n 的 概 率 转 移 而 来 但是前面的状态转移给自己时,却不一定以\frac{1}{n}的概率转移而来 ,n1

#include <bits/stdc++.h>
using namespace std;
double dp[109][1<<16];
int p[21],a[21],k,n;
int main()
{
	cin >> k >> n;
	for(int i=0;i<n;i++)
	{
		cin >> a[i];
		int x;;
		while( cin>>x && x )
			p[i]+=( 1<<(x-1) );
	}
	int last=(1<<n);
	for(int i=k;i;i-- )
	{
		for(int j=0;j<last;j++)
		for(int q=0;q<n;q++)
		{
			if( (j&p[q])==p[q] )//可选可不选 
				dp[i][j]+=max( dp[i+1][j],dp[i+1][j|(1<<q)]+a[q] );
			else//拿不了,只能这么转移 
				dp[i][j]+=dp[i+1][j];
			if( q==n-1 )	dp[i][j]/=(double)n;
		}
	}
	printf("%.6lf",dp[1][0] );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值