LeetCode 799.シャンパンタワー(DP動的プログラミング)

記事ディレクトリ

1.タイトル

グラスをピラミッド状に配置し、第1層に1枚、第2層に2枚、というように100層目に配置します。各グラス(250ml)にはシャンパンが含まれます。

上に第一のガラスからいくつかのシャンパンを注ぐ。上にガラスがいっぱいになると、任意溢れシャンパンがすぐう流れ眼鏡に左右で等しい流れ
左右のカップがいっぱいになると、左右のカップに流れが流れるのを待ちます。(下のガラスがいっぱいになると、シャンパンが床に流れます)

たとえば、シャンパンを1杯注いだ後、一番上のガラスがいっぱいになります。シャンパンを2杯注いだ後、2階の2杯がそれぞれシャンパンの半分を満たしました。シャンパンを3杯注いだ後、2階は満員になりました。現時点では満杯のグラスが3つあります。下の写真に示すように、4番目のガラスを注いだ後、3番目の層の中央のガラスにはシャンパンの半分が含まれ、彼の両側のガラスにはそれぞれシャンパンの4分の1が含まれていました。

ここで、非負の整数のシャンパングラスを注ぐと第 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 ms 41.6 MB

皆様のご多幸をお祈り申し上げます。


私のCSDNブログアドレスhttps://michael.blog.csdn.net/

QRコードを長押しまたはスキャンして、私の公式アカウント(Michael Amin)をフォローし、一緒に来て、学び、一緒に進歩してください!
マイケルアミン

おすすめ

転載: blog.csdn.net/qq_21201267/article/details/108893062