[HDU] 4089 활성화 확률 DP
dp[i][j]를 모두 i개인의 대기열인 Tomato가 j위 서버가 마비될 확률로 역추를 사용하면 우리는 상태 이동 방정식을 얻을 수 있다.
i == 1 : dp[1][1] = dp[1][1] * p1 + dp[1][1] * p2 + p4;
i > 1 :
2 <= j <= k : dp[i][j] = dp[i][j] * p1 + dp[i][j - 1] * p2 + dp[i - 1][j - 1] * p3 + p4;//앞에 K명이 부족해, 토마토 분노.
k + 1 <= j <= i : dp[i][j] = dp[i][j] * p1 + dp[i][j - 1] * p2 + dp[i - 1][j - 1] * p3;
(여기 k는 i보다 클 수 있습니다. 우리는 잠시 상관하지 않겠습니다. 아래에서 우리는 다시 이곳의 부작용을 없애겠습니다.)
ppp=p2/(1-p1), pp3=p3/(1-p1), pp4=p4/(1-p1);
명령:
i == 1 c[1] = pp4;
2 <= j <= k : c[j] = dp[i - 1][j - 1] * pp3 + pp4;
k + 1 <= j <= i : c[j] = dp[i - 1][j - 1] * pp3;
제거k>i의 경우: 1<=j<=i:c[j]=dp[i-1][j-1]*pp3+(j<=k?pp4:0);(여기 기본 dp[0][j] 초기화됨)
단순화:
j == 1 : dp[i][1] = dp[i][i] * p + c[1]; (1)
2 <= j <= i : dp[i][j] = dp[i][j - 1] * pp2 + c[j];
점차적인 관계에서 알 수 있듯이 dp[i][i]=dp[i][1]*p^(i-1)+tmp; (2)
그중 tmp=c[1]^(i-1)+c[2]^(i-2)+... + c[i - 1];
연립(1), (2) dp[i][1]를 없애면 dp[i][i] = tmp/(1-p^i);(dp[i][i]도 제거할 수 있음)
회대 득원식: 2<=j
코드는 다음과 같습니다.
//HDU 4089 Activation DP
/*
p = p2 / (1 - p1)
p31 = p3 / (1 - p1)
p41 = p4 / (1 - p1)
i = 1: c[1] = pp4, dp[1][1] = pp4 / (1 - p)
j == 1:c[1] = pp4;
2 <= j <= k:c[j] = dp[i - 1][j - 1] * pp3 + pp4;(1)
k + 1 <= j <= i:c[j] = dp[i - 1][j - 1] * pp3; (2)
(1)、(2) :2 <= j <= i: c[j] = dp[i - 1][j - 1] * pp3 + (i <= k ? pp4 : 0);
:
j == 1:dp[i][1] = dp[i][i] * p + c[1]; (3)
2 <= j <= k:dp[i][j] = dp[i][j - 1] * p + c[j]; (4)
k + 1 <= j <= i:dp[i][j] = dp[i][j - 1] * p + c[j]; (5)
(4)、(5) :2 <= j <= i: dp[i][j] = dp[i][j - 1] * p + c[j];
:dp[i][i] = dp[i][1] * pow(p, i - 1) + tmp; (6)
tmp = c[1] ^ (i - 1) + c[2] ^ (i - 2) + ... + c[i - 1];
(3)、(6) :dp[i][i] = tmp / (1 - pow(p, i));
:2 <= j < i: dp[i][j] = dp[i][j - 1] * p + c[j];
dp[n][m];
*/
#include <stdio.h>
#include <string.h>
#define REP(i, a, b) for(int i = a; i <= b; ++i)
const double eps = 1e-5;
const int O = 2005;
double pp[O], dp[O][O], c[O], p1, p2, p3, p4, p, pp3, pp4;
int n, m, k;
void work(){
if(1 - p1 - p2 < eps){// 0
printf("%.5f
", 0);
return;
}
if(p4 < eps){// 0.00001 0.00000
printf("%.5f
", 0);
return;
}
p = p2 / (1 - p1);
pp3 = p3 / (1 - p1);
pp4 = p4 / (1 - p1);
pp[0] = 1.0;
REP(i, 0, n) dp[0][i] = dp[i][i] = 0;
REP(i, 1, n) pp[i] = p * pp[i - 1];
dp[1][1] = p4 / (1 - p1 - p2);
REP(i, 2, n){
REP(j, 1, i) c[j] = dp[i - 1][j - 1] * pp3 + (j <= k ? pp4 : 0);
REP(j, 1, i) dp[i][i] += c[j] * pp[i - j];
dp[i][i] /= (1 - pp[i]);
dp[i][1] = dp[i][i] * p + c[1];
REP(j, 2, i - 1) dp[i][j] = dp[i][j - 1] * p + c[j];
}
printf("%.5f
", dp[n][m]);
}
int main(){
while(~scanf("%d%d%d%lf%lf%lf%lf", &n, &m, &k, &p1, &p2, &p3, &p4)) work();
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.