BZOJ 1076: [SCOI2008]奖励关(概率+dp)
2014-10-06 22:07
253 查看
首先嘛,看了这么久概率论真的不错啊。看到就知道怎么写(其实也挺容易的= =)
直接数位dp就行了
CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int g[20],a[20],q[20];
double f[120][66000];
int main(){
int n,m;
scanf("%d%d",&m,&n);
for (int i=1;i<=n+1;i++) g[i]=1<<(i-1);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
for (;;){
int x;
scanf("%d",&x);
if (x==0) break;
q[i]+=g[x];
}
}
for (int i=m;i;i--) {
for (int j=0;j<=g[n+1]-1;j++) {
f[i][j]=0;
for (int k=1;k<=n;k++) {
if ((j&q[k])==q[k]) f[i][j]+=max(f[i+1][j],f[i+1][j|g[k]]+a[k]);
else f[i][j]+=f[i+1][j];
}
f[i][j]/=n*1.0;
}
}
printf("%.6lf\n",f[1][0]);
return 0;
}
直接数位dp就行了
CODE:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int g[20],a[20],q[20];
double f[120][66000];
int main(){
int n,m;
scanf("%d%d",&m,&n);
for (int i=1;i<=n+1;i++) g[i]=1<<(i-1);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
for (;;){
int x;
scanf("%d",&x);
if (x==0) break;
q[i]+=g[x];
}
}
for (int i=m;i;i--) {
for (int j=0;j<=g[n+1]-1;j++) {
f[i][j]=0;
for (int k=1;k<=n;k++) {
if ((j&q[k])==q[k]) f[i][j]+=max(f[i+1][j],f[i+1][j|g[k]]+a[k]);
else f[i][j]+=f[i+1][j];
}
f[i][j]/=n*1.0;
}
}
printf("%.6lf\n",f[1][0]);
return 0;
}
相关文章推荐
- BZOJ.1076.[SCOI2008]奖励关(概率DP 倒推)
- bzoj 1076: [SCOI2008]奖励关【状压dp+概率dp】
- BZOJ 1076 [SCOI2008]奖励关 状压+期望DP 题解
- [期望DP] BZOJ1076: [SCOI2008]奖励关
- [BZOJ 1076][SCOI2008]奖励关:状压DP
- 【BZOJ1076】【SCOI2008】奖励关(DP、期望、状压)
- [BZOJ1076][SCOI2008]奖励关 状压dp
- 【BZOJ 1076】 [SCOI2008]奖励关 期望dp
- [bzoj1076][SCOI2008]奖励关 状压DP
- BZOJ 1076 SCOI2008 奖励关 期望状压DP
- BZOJ 1076: [SCOI2008]奖励关 状压,期望DP
- [BZOJ1076][SCOI2008]奖励关解题报告|状压DP
- bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)
- 【BZOJ1076】[SCOI2008]奖励关【期望DP】【状压DP】
- BZOJ 1076: [SCOI2008]奖励关(期望+状压DP)
- bzoj 1076: [SCOI2008]奖励关 期望dp+状态压缩
- 【bzoj1076】[SCOI2008]奖励关 期望dp+状态压缩dp
- BZOJ_1076_[SCOI2008]奖励关_状压DP
- bzoj 1076: [SCOI2008]奖励关 (期望dp)
- bzoj1076 [SCOI2008]奖励关 状压+期望dp