1. 程式人生 > >BZOJ 1076([SCOI2008]獎勵關-期望dp-從後向前)

BZOJ 1076([SCOI2008]獎勵關-期望dp-從後向前)

1076: [SCOI2008]獎勵關

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 328  Solved: 199
[Submit][Status][Discuss]

Description

你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裡,系統將依次隨機丟擲k次寶物,每次你都可以選擇吃或者不吃(必須在丟擲下一個寶物之前做出選擇,且現在決定不吃的寶物以後也不能再吃)。 寶物一共有n種,系統每次丟擲這n種寶物的概率都相同且相互獨立。也就是說,即使前k-1次系統都丟擲寶物1(這種情況是有可能出現的,儘管概率非常小),第k次丟擲各個寶物的概率依然均為1/n。 獲取第i種寶物將得到Pi分,但並不是每種寶物都是可以隨意獲取的。第i種寶物有一個前提寶物集合Si。只有當Si中所有寶物都至少吃過一次,才能吃第i種寶物(如果系統丟擲了一個目前不能吃的寶物,相當於白白的損失了一次機會)。注意,Pi可以是負數,但如果它是很多高分寶物的前提,損失短期利益而吃掉這個負分寶物將獲得更大的長期利益。 假設你採取最優策略,平均情況你一共能在獎勵關得到多少分值?

Input

第一行為兩個正整數k和n,即寶物的數量和種類。以下n行分別描述一種寶物,其中第一個整數代表分值,隨後的整數依次代表該寶物的各個前提寶物(各寶物編號為1到n),以0結尾。

Output

輸出一個實數,保留六位小數,即在最優策略下平均情況的得分。

Sample Input

1 2
1 0
2 0

Sample Output


1.500000

HINT


【樣例2】 
Input 
6 6 
12 2 3 4 5 0 
15 5 0 
-2 2 4 5 0 
-11 2 5 0 
5 0 
1 2 4 5 0 
Output 
10.023470 
【資料規模】 
1<=k<=100,1<=n<=15,分值為[-10^6,10^6]內的整數。 

Source

期望DP.

根據期望DP 這一步的期望=(上一步的期望+上一步de得分)/k (k為種類數)

從後往前算是規避不可能狀態的常用手段

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<functional>
#include<iostream>
using namespace std;
#define MAXN (100+10)
#define MAXK (16)
double f[MAXN][(1<<MAXK)-1];
int n,k,p[MAXK+1],d[MAXK+1]={0};
int main()
{
	scanf("%d%d",&n,&k);
	int m=(1<<k)-1;
	for (int i=0;i<MAXN;i++)
		for (int j=0;j<=m;j++) f[i][j]=0.0;
	for (int i=1;i<=k;i++)
	{
		scanf("%d",&p[i]);
		int t;
		while (scanf("%d",&t)!=EOF&&t)
		{
			d[i]|=(1<<(t-1));
		}
	}
	for (int i=n;i;i--)
		for (int j=0;j<=m;j++)
		{
			for (int l=1;l<=k;l++)
				if ((d[l]&j)==d[l])
					f[i][j]+=max(f[i+1][j],f[i+1][j|(1<<(l-1))]+p[l]);//eat or not
					else f[i][j]+=f[i+1][j]; //can't eat
			f[i][j]/=(double)k;			
		}
	printf("%.6lf\n",f[1][0]);
	return 0;
}


相關推薦

BZOJ 1076([SCOI2008]獎勵-期望dp-向前)

1076: [SCOI2008]獎勵關 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 328  Solved: 199 [Submit][Status][Discuss] Description 你正在玩你最喜歡的電子遊

bzoj 1076: [SCOI2008]獎勵(期望DP,狀壓。)

Description   你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裡,系統將依次隨機丟擲k次寶物, 每次你都可以選擇吃或者不吃(必須在丟擲下一個寶物之前做出選擇,且現在決定不吃的寶物以後也不能再吃)。  寶物一共有n種,系統每次丟擲這n種寶物的概率

bzoj 1076: [SCOI2008]獎勵 期望dp+狀態壓縮

Description   你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裡,系統將依次隨機丟擲k次寶物, 每次你都可以選擇吃或者不吃(必須在丟擲下一個寶物之前做出選擇,且現在決定不吃的寶物以後也不能再吃)。 寶物一共有n種,系統每次丟

[BZOJ 1076][SCOI2008]獎勵期望+狀壓Dp

方便 double spa solution bsp 所有 一個 int stream Description 你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裏,系統將依次隨機拋出k次寶物, 每次你都可以選擇吃或者不吃(必須在拋出下一個寶物之前做出選

BZOJ 1076 [SCOI2008]獎勵【狀態壓縮】【期望DP

基於hzwer的部落格。 lim[i]lim[i]lim[i]表示可以獲得iii得前提。 考慮倒推,當前狀態的期望=(上一個狀態的期望+這次得到的價值)/概率 #include <bits/stdc++.h> #define db double #d

bzoj 1076: [SCOI2008]獎勵期望dp

1076: [SCOI2008]獎勵關 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1814  Solved: 992 [Submit][Sta

BZOJ 1076 SCOI2008獎勵 狀壓與期望DP

Problem Problem Description 你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裡,系統將依次隨機丟擲k次寶物,每次你都可以選擇吃或者不吃(必須在丟擲下一個寶物之前做出選擇,且現在決定不吃的寶物以後也不能再吃)。

BZOJ 1076】 [SCOI2008]獎勵 期望dp

首先看到n的範圍非常的小,所以考慮狀壓f[i][j]表示現在扔到i次,然後第二維表示有那些吃過,所以轉移就是f[i][j]+=f[i-1][k]+val[]且 pre[i]&k==pre[i]

BZOJ 1076: [SCOI2008]獎勵期望+狀壓DP

傳送門 題解 不能從前往後推,求期望的正確姿勢應該是從後往前。 每個物品有先決限制,我們將已獲得的物品狀壓起來。記f[i][s]為第i關開始前擁有集合s的得分期望。 列舉關卡數、集合和第i關的物品。若滿足先決條件,則f[i][s] += ma

bzoj1076: [SCOI2008]獎勵(期望dp+狀壓dp)

多少 || 註意 log mem 1.5 tchar fine bbs 1076: [SCOI2008]獎勵關 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2989 Solved: 1557[Submit][Sta

bzoj 1076: [SCOI2008]獎勵

目前 sin 最大 ios 有一個 決定 cpp 正在 gpo Description 你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裏,系統將依次隨機拋出k次寶物,每次你都可以選擇吃或者不吃(必須在拋出下一個寶物之前做出選擇,且現在決定不吃的寶物以後也不

[bzoj 1076][SCOI2008]獎勵

pan 遊戲 表示 bold paper esc max efi 決定 傳送門 Description 你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裏,系統將依次隨機拋出k次寶物, 每次你都可以選擇吃或者不吃(必須在拋出下一個寶物之前做出選擇,

BZOJ 1076 [SCOI2008]獎勵

看了資料範圍一目瞭然是狀態壓縮,然而對於每種情況有選和不選兩種情況,記錄已選的狀態,每次列舉關卡時判斷是否已選。 注意這種最優選擇一般都採取倒序才能排除掉一些不可預知的不合法情況,我正序寫了仨小時不

1076. [SCOI2008]獎勵【狀壓DP+期望

下一個 blog pos out 至少 處理 hellip 每次 選擇 Description   你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裏,系統將依次隨機拋出k次寶物, 每次你都可以選擇吃或者不吃(必須在拋出下一個寶物之前做出選擇,且現在

BZOJ1076 [SCOI2008]獎勵

算法 結合 期望dp 枚舉 來源 獎勵 使用 狀態 題目 【算法】期望DP+狀壓DP 【題解】f[i][j]表示第i輪,狀態為j的期望得分。 期望DP一般倒著做,因為正著做的話會可能從很多狀態都可以滿足當前選擇,需要雙重枚舉。 而如果倒著做的話,是已知當前狀態枚舉後面的選擇

1076: [SCOI2008]獎勵

獎勵 %d col 就是 ret main sco ios pre 這題有點坑。 很容易看出是狀壓吧。 但請謹記求概率用正推,期望用逆推。 然而這題為啥我一開始覺得逆推不行呢。 就是因為前置集合。 那麽為啥不影響呢。 其實我們逆推的時候也可以判斷這個時候可不可以

[BZOJ1076][SCOI2008]獎勵(概率DP)

har getch IV AC name else str mes family Code #include <cstdio> #include <algorithm> #include <cstring> #define N

bzoj1076 獎勵 期望dp

題目傳送門   題目大意:總共有k次彈出寶物的機會,寶物共有n種,彈出不同的寶物的概率相同的,是每個寶物都有價值,和選擇這個寶物的限制(必須具有特定的寶物),問最後的最優期望是多少。   思路:“正向推概率,反向推期望。”,一看資料範圍就知道肯定是狀壓。   這裡推薦一個大佬的部落格 https://b

bzoj 1076】[SCOI2008]獎勵(狀壓dp+概率)

1076: [SCOI2008]獎勵關 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1817  Solved: 994 [Submit][Stat

【題解】 bzoj1076: [SCOI2008]獎勵 (裝壓+期望dp

狀態 span 方程 con can i+1 std tin log 題面戳我 Solution 並不會做,看了下題解大概了解了。期望這個東西好難搞啊qwq 我們定義\(dp[i][j]\)表示第\(i\)步,拿到寶物前的狀態為\(j\)。 正著來會有很多不合法的情況,剔