zoukankan      html  css  js  c++  java
  • bzoj 1076 奖励关 状压+期望dp

    因为每次选择都是有后效性的,直接dp肯定不行,所以需要逆推。

    f[i][j]表示从第i次开始,初始状态为j的期望收益

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int bit[18],K,n,aa,ned[18],a[18];
    double f[105][1<<17];
    int main()
    {
    	bit[0]=1;
    	for(int i=1;i<=16;i++) bit[i]=bit[i-1]<<1;
    	scanf("%d%d",&K,&n);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    		scanf("%d",&aa);
    		while(aa){
    			ned[i]|=bit[aa-1];
    			scanf("%d",&aa);
    		}
    	}
    	for(int i=K;i>=1;i--)
    		for(int j=0;j<bit[n];j++){
    			for(int k=1;k<=n;k++)
    			{
    				if((j&ned[k])==ned[k])
    					f[i][j]+=max(f[i+1][j],f[i+1][j|bit[k-1]]+a[k]);
    				else
    					f[i][j]+=f[i+1][j];
    			}
    			f[i][j]/=n;
    		}
    	printf("%0.6lf
    ",f[1][0]);
    	return 0;
    }


    人生如梦亦如幻 朝如晨露暮如霞。
  • 相关阅读:
    java 单链表 练习
    大问题-简明哲学导论
    git的常见错误
    python在Ubuntu添加模块搜索路径
    前端
    TCP/IP图解
    调试
    Design program
    算法
    面向对象-聚集,程序比较发现
  • 原文地址:https://www.cnblogs.com/Ren-Ivan/p/7746765.html
Copyright © 2011-2022 走看看