UVALive 6175 Maximum Random Walk 期望+概率dp

题目链接:点击打开链接

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const double eps = 1e-15;
const int N = 1000 + 2;
const int M = 2000 + 2;

double d[2][M][N];

void work() {
	int t, n, cur, nex;
	double a, b, c;
	scanf("%d%d%lf%lf", &t, &n, &a, &b);
	c = 1 - a - b;
	
	memset(d[0], 0, sizeof d[0]);
	d[0][n][0] = 1;
	for (int i = 0; i < n; ++i) {
		cur = i & 1;
		nex = 1 - cur;
		for (int j = n - i - 1; j <= n + i + 1; ++j)
			for (int k = 0; k <= i + 1; ++k)
				d[nex][j][k] = 0;
		
		for (int j = n - i; j <= n + i; ++j)
			for (int k = 0; k <= i; ++k)
				if (d[cur][j][k] > eps) {
					if (j - n == k) {
						d[nex][j + 1][k + 1] += d[cur][j][k] * b;
					} else {
						d[nex][j + 1][k] += d[cur][j][k] * b;
					}
					//
					d[nex][j - 1][k] += d[cur][j][k] * a;
					//
					d[nex][j][k] += d[cur][j][k] * c;
				}
	}
	double ans = 0;
	for (int i = 0; i <= n; ++i)
		for (int j = 0; j <= n + n; ++j)
			ans += d[n & 1][j][i] * i;
	printf("%d %.4f\n", t, ans);
}
int main() {
	int cas;
	scanf("%d", &cas);
	while (cas -- > 0) {
		work();
	}
	return 0;
}


你可能感兴趣的:(UVALive 6175 Maximum Random Walk 期望+概率dp)