Codeforces 16E Fish(상압 dp+ 확률)
5151 단어 codeforces
제목의 뜻
n마리의 물고기가 있는데 그들은 만날 때 상대방을 잡아먹는다. 그들이 만날 때 쌍방이 이길 확률을 주고 이 n마리의 물고기가 마지막에 자신에게 남을 확률을 구한다.
사고의 방향
범위를 보면 상압DP를 고려해야 한다. dp[s]는 현재 남은 물고기의 상태가 s일 때의 확률을 나타낸다.그러면 P(i가 j를 잡아먹는다)=P(i와 j가 동시에 존재)*P(ij가 만나)*P(i가 j를 이긴다)=dp[s^(1
코드
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <list>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define LL long long
#define lowbit(x) ((x)&(-x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1|1
#define MP(a, b) make_pair(a, b)
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int maxn = 1e5 + 10;
const double eps = 1e-8;
const double PI = acos(-1.0);
typedef pair<int, int> pii;
double dp[1<<19];
double p[20][20];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> p[i][j];
dp[(1 << n) - 1] = 1.0;
for (int s = (1 << n) - 1; s > 0; s--)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if ((s & (1 << i)) && (s & (1 << j)))
{
if (i == j) continue;
int num = __builtin_popcount(s);
dp[s ^ (1 << j)] += dp[s] * p[i][j] / (num * (num - 1) / 2);
}
for (int i = 0; i < n; i++)
printf("%.6f ", dp[1<<i]);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Codeforces Round #715 Div. 2C The Sports Festival: 구간 DP전형구간 DP의 초전형. 이하, 0-indexed. 입력을 정렬하여 어디서나 시작하고 최적으로 좌우로 계속 유지하면 좋다는 것을 알 수 있습니다. {2000})$의 주문이 된다. 우선, 입력을 소트하여 n개의 요소를 $...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.