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
解释: 我们在顶层(下标是(0,0))倒了一杯香槟后,
没有溢出,因此所有在顶层以下的玻璃杯都是空的。
示例 2:
输入: poured(倾倒香槟总杯数) = 2,
query_glass(杯子的位置数) = 1,
query_row(行数) = 1
输出: 0.5
解释: 我们在顶层(下标是(0,0)倒了两杯香槟后,
有一杯量的香槟将从顶层溢出,
位于(1,0)的玻璃杯和(1,1)的玻璃杯平分了这一杯香槟,
所以每个玻璃杯有一半的香槟。
注意:
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)をフォローし、一緒に来て、学び、一緒に進歩してください!