一、思路
用一个数组dp表示当前这天没吃蛋糕之前的蛋糕数目,那么dp的最后一个值,dp[n-1]一定是初始化为1,dp[i]由dp[i+1]推导而来:
因为:
    dp[i+1] = dp[i] * (2/3)  - 1
所以:
    dp[i] = 3*(dp[i+1] + 1)/2

二、图示


三、详细流程
1、特殊情况:n < 1时直接返回0;
2、初始化dp[n-1] = 1;
3、确认循环范围,根据上述公式循环更新dp[n-2] ~ dp[0];
4、返回dp[0]

四、代码
class Solution {
public:
    /**
     * 
     * @param n int整型 只剩下一只蛋糕的时候是在第n天发生的.
     * @return int整型
     */
    int cakeNumber(int n) {
        // write code here
        if(n < 1)
            return 0;
        int* dp = new int[n];
        dp[n - 1] = 1;       //初始化
        for (int i = n - 2; i >= 0; --i) {
            dp[i] = 3 * (dp[i+1] + 1) / 2;
        }
        return dp[0];
    }
};