LeetCode 799. Башня шампанского (динамическое программирование DP)

1. Название

Ставим бокалы в форме пирамиды, в которой 1 бокал в первом слое, 2 во втором слое и т. Д. До 100-го слоя Каждый бокал (250 мл) будет содержать шампанское.

Налейте шампанское из первого стакана на вершине. Когда стекло сверху полно, любое перелива шампанского немедленно течь в очках на в левом и правом с равным потоком .
Когда чашки слева и справа заполнены, он будет ждать, пока поток не потечет к чашкам слева и справа, и так далее. (Когда нижний бокал наполнится, шампанское потечет на пол)

Например, после того, как вы налили бокал шампанского, самый верхний бокал наполняется. Налив два бокала шампанского, каждый из двух бокалов на втором этаже наполнил половину шампанского. После того, как вы налили три бокала шампанского, второй этаж заполнен - ​​сейчас три полных бокала. После того, как налили четвертый бокал, бокал в середине третьего слоя содержал половину шампанского, а бокалы с обеих сторон от него содержали четверть шампанского, как показано на рисунке ниже.

Теперь, когда наливается неотрицательное целое число бокала шампанского, возвращается 第 i 行 j 个пропорция шампанского, содержащегося в бокале, к объему бокала ( i 和 j都从0开始).

示例 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]

Источник: LeetCode (LeetCode) Ссылка: https://leetcode-cn.com/problems/champagne-tower
Авторские права принадлежат LeetCode . Для коммерческих перепечаток, пожалуйста, свяжитесь с официальным авторизатором. Для некоммерческих перепечаток укажите источник.

2. Решение проблем

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 мс 41,6 МБ

Желаю всем счастливого национального праздника и праздника середины осени!


Адрес моего блога CSDN https://michael.blog.csdn.net/

Нажмите и удерживайте или отсканируйте QR-код, чтобы подписаться на мою официальную учетную запись (Майкл Амин), приходите вместе, учитесь и добивайтесь прогресса вместе!
Майкл Амин

рекомендация

отblog.csdn.net/qq_21201267/article/details/108893062