• 【ybtoj高效进阶 21269】乐园之旅(期望DP)


    乐园之旅

    题目链接:ybtoj高效进阶 21269

    题目大意

    给你一个无重边无自环的无向图,每个点有分数和需要时间,然后边也需要时间。
    小明小红会等概率选择一个点作为出发点,先获得出发点的分数(同时也耗了时间),然后每次等概率的选择可以一步走到而 且有关的点进行得分。
    要你分别计算小明和小红的得分期望。

    思路

    首先不难看出两个人的计算是分开的。

    那这种肯定是期望 DP,反向转移。
    (f_{i,j}) 为当前在 (i),还剩 (j) 时间能有的得分期望。

    我们考虑转移,先找到它当前可以转移到的点的个数 (cnt)
    那如果没有转移的点,那 (f_{i,j}=h_i)
    否则,枚举每个可以转移到的点 (y)(f_{i,j}=sumlimits_y{h_i+dfrac{f_{y,j+t_{i,y}+c_x}}{cnt}})

    然后最后枚举一下最后结束的点,它们的和除 (n) 就是结果啦。

    代码

    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    struct node {
    	int x, to, nxt;
    }e[3001];
    int n, m, K, c[101], h1[101], h2[101];
    int x, y, z, le[101], KK;
    double f[101][501];
    
    void add(int x, int y, int z) {
    	e[++KK] = (node){z, y, le[x]}; le[x] = KK;
    	e[++KK] = (node){z, x, le[y]}; le[y] = KK;
    }
    
    double work(int *h) {
    	memset(f, 0, sizeof(f));
    	for (int i = K; i >= 0; i--)//DP
    		for (int j = 1; j <= n; j++) {
    			int num = 0;
    			for (int k = le[j]; k; k = e[k].nxt)
    				if (i + e[k].x + c[j] + c[e[k].to] <= K) {
    					f[j][i] += f[e[k].to][i + c[j] + e[k].x];
    					num++;
    				}
    			if (!num) f[j][i] = 0;
    				else f[j][i] = f[j][i] / num;
    			if (i + c[j] <= K) f[j][i] += h[j];
    		}
    	
    	double re = 0.0;
    	for (int i = 1; i <= n; i++)
    		re += f[i][0] / n;
    	return re;
    }
    
    int main() {
    //	freopen("park.in", "r", stdin);
    //	freopen("park.out", "w", stdout);
    	
    	scanf("%d %d %d", &n, &m, &K);
    	for (int i = 1; i <= n; i++) scanf("%d %d %d", &c[i], &h1[i], &h2[i]);
    	for (int i = 1; i <= m; i++) {
    		scanf("%d %d %d", &x, &y, &z);
    		add(x, y, z);
    	}
    	
    	printf("%.5lf %.5lf", work(h1), work(h2));
    	
    	return 0;
    }
    
  • 相关阅读:
    [leetcode]Set Matrix Zeroes
    [leetcode]Sort Colors
    [leetcode]Combinations
    [leetcode]Subsets
    [leetcode]Search a 2D Matrix
    [leetcode]Best Time to Buy and Sell Stock III
    [leetcode]Best Time to Buy and Sell Stock II
    [leetcode]Best Time to Buy and Sell Stock
    半平面交 (poj 1279(第一道半平面NlogN)完整注释 )
    hdu 4277 USACO ORZ (Dfs)
  • 原文地址:https://www.cnblogs.com/Sakura-TJH/p/YBTOJ_GXJJ_21269.html
Copyright © 2020-2023  润新知