洛谷 P2473 [SCOI2008]奖励关 ( 期望DP )

题目链接

题意 : 中文题、点链接

 

分析 :

第一道有关概率期望的DP

有个大部分情况下通用的结论

概率正推、期望反推

原因不明、其实是没有查到较好的解释

这题由于有一些取物品的先决条件在这里

而且观察到题目 n 并不是很大

果断选择状压来解决

这题定义 dp[i][j] 到第 i 回合、拿过物品状态为 j 的情况的最优值是什么

转移的时候、第一维倒序枚举回合、第二维枚举状态、然后第三维枚举每个物品

如果当前状态包含了当前枚举到的物品的先决物品的话

则有转移 dp[i][j] += max( dp[i+1][j]、dp[i+1][j | (1<<k)] + val[k] ) / n

否则 dp[i][j] += dp[i+1][j] / n

 

#include<bits/stdc++.h>
using namespace std;

double dp[105][(1<<16) + 10];
int Pre_State[20], val[20];

int main(void)
{
    int Times, n;
    scanf("%d %d", &Times, &n);

    for(int i=1; i<=n; i++){
        scanf("%d", &val[i]);
        int pre;
        while(~scanf("%d", &pre) && pre){
            Pre_State[i] |= (1<<pre);
        }
    }

    for(int i=Times-1; i>=0; i--){
        for(int s=0; s<(1<<(n+1)); s++){
            for(int j=1; j<=n; j++){
                if((s & Pre_State[j]) == Pre_State[j]){
                    dp[i][s] += max(dp[i+1][s], dp[i+1][s | (1<<j)] + val[j]) / n;
                }else dp[i][s] += dp[i+1][s] / n;
            }
        }
    }

    printf("%.6lf\n", dp[0][0]);

    return 0;
}
View Code

 

posted @ 2018-08-27 17:28  qwerity  阅读(161)  评论(0编辑  收藏  举报