• 洛谷 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
    ", dp[0][0]);
    
        return 0;
    }
    View Code
  • 相关阅读:
    java的异常
    Quartz使用总结
    MYSQL性能优化的最佳20+条经验
    索引原理和慢查询优化
    MySQL索引背后的数据结构及算法原理
    常见电商项目的数据库表设计(MySQL版)
    常见试题和算法
    mysql性能调优与架构设计笔记
    MYSQL数据库设计规范与原则
    复合索引的优点和注意事项
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/9543516.html
Copyright © 2020-2023  润新知