BZOJ 3925 지진 후의 환상의 고장
AC Code:
#include
#define maxn 11
#define maxm 55
using namespace std;
int n,m;
int sz[1<<maxn],lg[1<<maxn];
double C[maxm][maxm],f[maxm][1<<maxn][2];
int c[maxn][maxn];
int main()
{
scanf("%d%d",&n,&m);
C[0][0] = 1;
for(int i=1;i<maxm;i++)
{
C[i][0] = 1;
for(int j=1;j<=i;j++)
C[i][j] = C[i-1][j-1] + C[i-1][j];
}
for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),u--,v--,c[u][v]=c[v][u]=1;
for(int i=0;i<n;i++) lg[1<<i] = i;
for(int i=1;i<(1<<n);i++)
{
int tmp = i & (-i) , v = lg[i & (-i)],rsta=i-tmp;
sz[i] = sz[rsta];
for(int j=0;j<n;j++)
if((rsta)>>j&1)
sz[i] += c[j][v];
}
for(int sta=1;sta<(1<<n);sta++)
{
for(int i=0;i<=sz[sta];i++)
{
int p = sta & (-sta);
for(int t=sta;t;t=(t-1)&(sta))
if((t&p) && (t!=sta))
{
for(int k=0;k<=i;k++)
f[i][sta][0] += f[k][t][1] * C[sz[sta-t]][i-k];
}
f[i][sta][1] = C[sz[sta]][i] - f[i][sta][0];
}
}
double ans = 0;
for(int i=0;i<=m;i++)
ans += f[i][(1<<n)-1][0] / C[m][i];
ans /= m+1;
printf("%.6lf
",ans);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ]11048(python)python 풀이 DP를 이용해 풀이 보통 이런 문제는 dfs나 bfs로 풀이하는 것이여서 고민을 했는데 이 문구 덕분에 DP 를 이용해 풀이할 수 있었다 뒤로 돌아가는 등의 경우를 고려하지 않아도 되기 때문이다 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.