模拟题。使用dp
对于中间的一个酒杯dp[i][j]
只受两个酒杯的影响dp[i - 1][j - 1]
和dp[i - 1][j]
,两端的酒杯只受上层一个酒杯的影响。
因此可以使用代码简单模拟这个过程,当上一层的酒杯满了之后,就向下流
class Solution {
public:
double champagneTower(int poured, int query_row, int query_glass) {
vector<vector<double>> dp(100, vector<double>(100, 0.00));
dp[0][0] = poured;
for(int i = 1; i < 100; i++)
{
if(i > query_row + 1)
break;
int flag = 0;
if(dp[i - 1][0] - 1.0 > 0)
{
dp[i][0] = (dp[i - 1][0] - 1.0) / 2.0;
dp[i][i] = (dp[i - 1][i - 1] - 1.0) / 2.0;
flag = 1;
}
for(int j = 1; j < i; j++)
{
if(dp[i - 1][j - 1] - 1.0 > 0)
{
dp[i][j] += (dp[i - 1][j - 1] - 1.0) / 2.0;
flag = 1;
dp[i - 1][j - 1] = 1.0;
}
if(dp[i - 1][j] - 1.0 > 0)
{
dp[i][j] += (dp[i - 1][j] - 1.0) / 2.0;
flag = 1;
}
}
if(dp[i - 1][i - 1] - 1.0 > 0)
dp[i - 1][i - 1] = 1.0;
if(flag == 0)
break;
}
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < i; j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}
return dp[query_row][query_glass];
}
};
改进
class Solution {
public:
double champagneTower(int poured, int query_row, int query_glass) {
vector<vector<double>> dp(101, vector<double>(101, 0));
dp[0][0] = poured;
for(int i = 0; i <= query_row; i++)
{
int flag = 1;
for(int j = 0; j <= i; j++)
{
if(dp[i][j] > 1.0)
{
dp[i + 1][j] += (dp[i][j] - 1.0) / 2.0;
dp[i + 1][j + 1] += (dp[i][j] - 1.0) / 2.0;
dp[i][j] = 1.0;
flag = 0;
}
}
if(flag)
break;
}
return dp[query_row][query_glass];
}
};