1 题目
The Tribonacci sequence Tn is defined as follows:
T0 = 0, T1 = 1, T2 = 1, and Tn+3 = Tn + Tn+1 + Tn+2 for n >= 0.
Given n
, return the value of Tn.
2 尝试解
2.1 分析
求斐波那契数列的第n项,其中F(0) = 0, F(1) = 1, F(2) = 1, F(n) = F(n-1) + F(n-2) + F(n-3),n > 2。
典型的动态规划题目,可以自底向上,也可以自顶向下。
2.2 代码
//From Top down
class Solution {
public:
int help(int n, vector<int>&dp){
if(dp[n] == -1){
int result = help(n-1,dp)+help(n-2,dp)+help(n-3,dp);
dp[n] = result;
}
return dp[n];
}
int tribonacci(int n) {
vector<int> dp(max(3,n+1),-1);
dp[0] = 0;
dp[1] = 1;
dp[2] = 1;
return help(n,dp);
}
};
//From bottom up
class Solution {
public:
int tribonacci(int n) {
vector<int> dp(max(3,n+1),-1);
dp[0] = 0;
dp[1] = 1;
dp[2] = 1;
for(int i = 3; i <= n; i++){
dp[i] = dp[i-1]+dp[i-2]+dp[i-3];
}
return dp[n];
}
};
3 标准解
3.1 分析
dp[n]只与前三项有关,所以自底向上时,完全可以只保留三项。
3.2 代码
class Solution {
public:
int tribonacci(int n) {
if (n < 3) return n == 0 ? 0 : 1;
int tmp, x = 0, y = 1, z = 1;
for (int i = 3; i <= n; ++i) {
tmp = x + y + z;
x = y;
y = z;
z = tmp;
}
return z;
}
};