代码:
// 记忆化搜索
int dfs(int n)
{
if (n < 0 || n == 3 || n == 6)
return 0;
if (n == 0)
return 1;
if (dp[n]) // 如果已经搜索过,则直接返回。如果没有记忆化搜素,时间复杂度将高达O(3n)
return dp[n];
dp[n] = 0;
dp[n] += dfs(n - 1) + dfs(n - 2) + dfs(n - 3);
return dp[n];
}
机器:CPU:i5-7200U CPU @ 2.50GHz 2.71 GHz
测试数据大小n | 30 | 33 | 35 | 37 |
---|---|---|---|---|
无记忆化搜索 | 0.171s | 1.154s | 3.833s | 12.90s |
有记忆化搜索 | 0s | 0.001s | 0.001s | 0.001s |
总结:
牺牲内存换取时间,记忆化搜索极大地提升了代码的运行速度!