这真是一道好题!这道题不仅考察了抽象思维,还考察了分析能力、化繁为简的能力,同时还有对基本功的考察。想顺利地做出这道题还挺不容易!我倒在了第一步与第二步:抽象思维和化繁为简。题目的要求稍微复杂一些,我就看不出问题的本质了。这一方面体现的是抽象能力的缺失,另一方面体现的则是拙劣的思考能力。
1. 题目
2. 思考
这道题给我的启示就是:多多动脑,理解题意,抽象化分析题目,然后化繁为简,用大脑的思考量去简化代码。本质上,这是一道动态规划题,但是找到动态规划之前,还需要两步预处理。
- 第一步:得计算出每个数值对应的和具体是多少,把这个和写到一个数组中,这样就可以避免处理原数组中相同的数;
- 第二步:如何破解题意信息?题目中说到如果选了值为i的数,那么就不能再选值为
i-1
,也不能选i+1
的数了。我原本的处理方式是使用两个数组,分别记录从左到右和从右到左的最大值,最后把两个方向上的值合在一起得到最终的结果。但是这么做实在太绕了!
那有没有简单的方法呢?1, 2, 3, 4, ..., i-1, i, i+1, ...
对于这么一串数字,在判断数值i
时能得到的最大点数,其实就是相当于从dp[i-1]
和 dp[i-2]
中递推;有同学可能会问,题目中不是说dp[i]也依赖于dp[i+1]取不取吗?如果dp[i+1]取了,那么dp[i]就不能取了。虽然是这么个理儿,但是dp[i+1]的问题就留给(i+1)-1来避免。 这样就保证了对数i+1决策的时候,是对数i进行判断了的。
上面这一段的逻辑很重要,非常重要。以至于它决定了你能否很快的解出题来。
3. 代码
本次只做分析,代码略过,日后补上。