アーサーHNOI2015(確率DP)

ポータル

あなたは簡単に予想計算することができるように、各カードの検討は、それの確率を取得する
カードはそのラウンドのアカウントに関連し、考慮すべき回数を前の時点で考慮に選挙に関連するいくつかのカードをラウンド数をしながら、
メイクそう F [ ] [ J ] F [i]は[J] を表し R R ラウンド、第一 数ヶ月前と 選びました J J 確率
最終確率のうちカードであること
P i = j = 0 i 1 f [ i 1 ] [ j ] ( 1 ( 1 p ) r j ) P_I = \ sum_ {J = 0} ^ {I-1} F [I-1]〜[J] *(1-(1-P)^ {RJ})
f F それに投票しない現行の選挙を列挙するために転送しました
f [ i ] [ j ] = f [ i 1 ] [ j ] ( 1 p ) r j + f [ i 1 ] [ j 1 ] ( 1 ( 1 p ) r ( j 1 ) ) F [I] [J] = F [I-1]〜[J] *(1-P)^ {RJ} + F [I-1] [J-1] *(1-(1-P)^ { R-(J-1)})

#include<bits/stdc++.h>
#define cs const
using namespace std;
cs int N = 225;
int T, n, r;
double p[N]; int d[N];
double pw[N][N], f[N][N];
int main(){
	scanf("%d", &T);
	while(T--){
		scanf("%d%d", &n, &r);
		for(int i = 1; i <= n; i++){
			scanf("%lf%d", &p[i], &d[i]);
			pw[i][0] = 1; 
			for(int j = 1; j <= r; j++) pw[i][j] = pw[i][j - 1] * (1 - p[i]);
		}
		f[0][0] = 1;
		for(int i = 1; i <= n; i++){
			for(int j = 0; j <= r; j++){
				f[i][j] = f[i - 1][j] * pw[i][r - j] + f[i - 1][j - 1] * (1 - pw[i][r - j + 1]);
			}
		} double ans = 0;
		for(int i = 1; i <= n; i++){
			double p = 0;
			for(int j = 0; j < r; j++) p += f[i - 1][j] * (1 - pw[i][r - j]);
			ans += p * d[i];			
		} printf("%.10lf\n", ans);
	} return 0;
}
公開された610元の記事 ウォン称賛94 ビュー50000 +

おすすめ

転載: blog.csdn.net/sslz_fsy/article/details/103602215