1076: [SCOI2008]奖励关 概率与期望 DP
2016-01-15 17:02
288 查看
我们先考虑dp。
n很小,并且状态之间有明显的依赖关系,显然可以二进制状压。但是为了保证当前状态是从一个合法的状态转移而来是不好判断的。我们可以倒推,从后向前转移,因为后面的状态合法与前面的状态是否合法是没有关系的。倒推也是规避不合法状态的一种有效手段。这样最后的结果就是f[1][0]。
我表示不知道期望是什么东西。。更不知道怎么算。。膜一发题解吧QAQ。
这一步的期望=(上一步的期望+这一步的得分)/K。
n很小,并且状态之间有明显的依赖关系,显然可以二进制状压。但是为了保证当前状态是从一个合法的状态转移而来是不好判断的。我们可以倒推,从后向前转移,因为后面的状态合法与前面的状态是否合法是没有关系的。倒推也是规避不合法状态的一种有效手段。这样最后的结果就是f[1][0]。
我表示不知道期望是什么东西。。更不知道怎么算。。膜一发题解吧QAQ。
这一步的期望=(上一步的期望+这一步的得分)/K。
#include<iostream> #include<cstdio> using namespace std; double f[101][1<<15]; int n,K,v[25],d[25]; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int main() { K=read(); n=read(); for (int i=1;i<=n;i++) { v[i]=read(); int s=read(); while (s) d[i]|=1<<(s-1),s=read(); } for (int i=K;i;i--) for (int j=0;j<(1<<n);j++) { for (int k=1;k<=n;k++) if ((d[k]&j)==d[k]) f[i][j]+=max(f[i+1][j],f[i+1][j|(1<<(k-1))]+v[k]); else f[i][j]+=f[i+1][j]; f[i][j]/=n; } printf("%.6lf",f[1][0]); return 0; }
相关文章推荐
- js 等待function执行完
- 这是一篇测试blog
- 年轻就是拼一拼
- Oracle密码过期the password has expired
- Spring cloud实现服务注册及发现
- Linux vi 编辑器的使用
- Android中android:layout_alignParentBottom标签不生效
- vs2010如何打开vs2013
- Mongodb java api,spring整合mongodb
- Ubuntu 15.04 安装apache2+mysq+php5
- C\C++ 使用do{...}while(0)进行宏定义的好处!!!
- 在Linux下使用iconv转换字符串编码
- span的onclick事件
- 多张照片拍摄、图片浏览
- 【转】ASP.NET网站怎么发布web项目程序和怎么部署
- Linux ssh/scp连接时避免输入yes(公钥验证)并防止出现POSSIBLE BREAK-IN ATTEM
- 第三方包的调试方法
- 身入菩提心自静,心入菩提性自明
- oracle资源管理器的使用
- 杭电1590 Bridging signals