解题思路
按层来递推,摈弃时间的维度,直接想这个杯子一共会有多少酒到这里面
class Solution {
public:
double champagneTower(int poured, int query_row, int query_glass) {
//存的是上层一共流到这一杯子里面多少酒,可能大于1,说明的是它还会向下流
float dp[102][102] = {0};
dp[0][1] = poured;
for(int row = 1; row <= query_row; row++)
{
for(int col = 1; col <= row + 1; col++)
{
float left = (dp[row - 1][col - 1] - 1)/2;//上层的左边
if(left > 0)
dp[row][col] += left;
float right = (dp[row - 1][col] - 1)/2;//上层的右边
if(right > 0)
dp[row][col] += right;
// cout << row << ' ' << col << ' ' << dp[row][col] << endl;
}
}
//return 的最后结果不能大于1
return dp[query_row][query_glass + 1] > 1? 1: dp[query_row][query_glass + 1];
}
};
第二次写题
class Solution {
public:
double champagneTower(int poured, int query_row, int query_glass) {
vector<vector<double>> aPoured(query_row + 1, vector<double>(query_row + 1, 0.0));
aPoured[0][0] = poured;
for(int i = 1; i <= query_row; i++)
{
for(int j = 0; j <= i; j++)
{
aPoured[i][j] = aPoured[i - 1][j] > 1 ? (aPoured[i - 1][j] - 1)/2 : 0;
if(j - 1 >= 0)
aPoured[i][j] += aPoured[i - 1][j - 1] > 1? (aPoured[i - 1][j - 1] - 1)/2 : 0;
}
}
return aPoured[query_row][query_glass] > 1? 1:aPoured[query_row][query_glass];
}
};