记录重叠子问题的解
以计算Fibonacci数列为例,最简单粗暴的算法是
int F(int n)
{
if(n == 0 || n == 1)
return 1;
else
return F(n - 1) + F(n - 2);
}
例如计算F(5)
时,如图,有大量重复计算,造成效率低下,复杂度高达O(2n)
如果我们建立一个数组dp[n]
表示F(n)
的数值,尚未计算的设置为-1
,那么当碰到计算相同内容的时候,就可以直接使用之前的计算结果,即每个F(n)
现在至多只需计算一次,复杂度优化至O(n)
int dp[MAX]
int F(int n)
{
if(n == 0 || n == 1)
return 1;
if(dp[n] != -1)
return dp[n]; //已计算过,直接返回结果
else
{
dp[n]