LeetCode 799. Champagne Tower (programación dinámica DP)

Directorio de artículos

1. Título

Colocamos las copas en forma de pirámide, en la que hay 1 copa en la primera capa, 2 en la segunda capa y así sucesivamente hasta la capa 100. Cada copa (250ml) contendrá champagne.

Vierta un poco de champán de la primera copa en la parte superior. Cuando la copa de la parte superior esté llena, cualquier champán que se desborde fluirá inmediatamente hacia las copas de la izquierda y la derecha con el mismo flujo .
Cuando las tazas de la izquierda y la derecha estén llenas, esperará a que el flujo fluya hacia las tazas de la izquierda y la derecha, y así sucesivamente. (Cuando el vaso inferior esté lleno, el champán fluirá al suelo)

Por ejemplo, después de servir una copa de champán, la copa superior está llena. Después de servir dos copas de champán, las dos copas del segundo piso llenaron la mitad del champán. Después de servir tres copas de champán, el segundo piso está lleno, hay tres vasos llenos en este momento. Después de servir la cuarta copa, la copa en el medio de la tercera capa contenía la mitad del champán, y las copas a ambos lados contenían cada una una cuarta parte del champán, como se muestra en la imagen de abajo.

Ahora, cuando se vierte 第 i 行 j 个la copa de champán entera no negativa, i 和 j都从0开始se devuelve la proporción de champán contenido en la copa al volumen de la copa ( ).

示例 1:
输入: poured(倾倒香槟总杯数) = 1, 
query_glass(杯子的位置数) = 1, 
query_row(行数) = 1
输出: 0.0
解释: 我们在顶层(下标是(00))倒了一杯香槟后,
没有溢出,因此所有在顶层以下的玻璃杯都是空的。

示例 2:
输入: poured(倾倒香槟总杯数) = 2, 
query_glass(杯子的位置数) = 1, 
query_row(行数) = 1
输出: 0.5
解释: 我们在顶层(下标是(00)倒了两杯香槟后,
有一杯量的香槟将从顶层溢出,
位于(10)的玻璃杯和(11)的玻璃杯平分了这一杯香槟,
所以每个玻璃杯有一半的香槟。

注意:
poured 的范围[0, 10 ^ 9]。
query_glass 和query_row 的范围 [0, 99]

Fuente: LeetCode (LeetCode) Enlace: https://leetcode-cn.com/problems/champagne-tower Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

2. Resolución de problemas

class Solution {
    
    
public:
    double champagneTower(int poured, int query_row, int query_glass) {
    
    
    	vector<vector<double>> dp(101, vector<double>(101, 0.0));
    	double up_l, up_r;
    	dp[0][0] = poured;
    	for(int i = 1; i <= query_row; ++i) 
    	{
    
    
    		for(int j = 0; j <= i; ++j)
    		{
    
    
    			up_l = j > 0 ? dp[i-1][j-1] : 0;//上层左侧酒量
    			up_r = dp[i-1][j];//上层右侧酒量
    			dp[i][j] += up_l > 1 ? (up_l-1)/2.0 : 0;
    			//自己需要留下一杯 -1, 不够的话得到 0
    			dp[i][j] += up_r > 1 ? (up_r-1)/2.0 : 0;
    			//自己需要留下一杯 -1, 不够的话得到 0
    		}
    	}
    	return min(1.0, dp[query_row][query_glass]);
    }
};

24 ms 41,6 MB

¡Les deseo a todos un feliz Día Nacional y Festival del Medio Otoño!


Mi dirección de blog de CSDN https://michael.blog.csdn.net/

Mantenga presionado o escanee el código QR para seguir mi cuenta oficial (Michael Amin), ¡vengan juntos, aprendan y progresen juntos!
Michael Amin

Supongo que te gusta

Origin blog.csdn.net/qq_21201267/article/details/108893062
Recomendado
Clasificación