方法一:递归
时间效率2n
这个令人窒息的时间效率,部分代码片段如下:
if (nums[i] + message_A(nums, i + 2) > nums[i] + message_A(nums, i + 3))
{
return nums[i] + message_A(nums, i + 2);
}
else
{
return nums[i] + message_A(nums, i + 3);
}
前面的文章提到的为了解决递归的低效率,使用动态规划
自低而上的分析,每次累加新的常量,中间只能相隔两个或者一个字符,dp[i]的值取决于dp[i-2]和i的和,还有dp[i-1]的大小。
dp[0] = nums[0];
dp[1] = max(nums[1],nums[0]);
for(i=2,i<nums.size(),i++)
{
dp[i] = max(dp[i-2]+nums[i],dp[i]);
}
时间效率O(n),空间效率O(n)
还有更好的解法,空间效率O(1)
int pre =0,cur =0,res=0;
for(int i=0,i<nums.size(),i++)
{
res = max(pre+nums[i],cur);
pre =cur;
cur = res;
}