题解 | #不相邻取数#

不相邻取数

http://www.nowcoder.com/practice/a2be806a0e5747a088670f5dc62cfa1e

根据题意,本题与"打家劫舍"的思路很相似,按照动态规划的思路,建立 dp 数组,赋初值,然后根据转移方程进行迭代;由于选取的数字是不相邻的数字,则 dp[i] 与 dp[i - 1] 和 dp[i - 2] + data[i] 有关,初始值 dp[0] = data[0], 动态规划数组每次进行状态转移只与本次相关状态有关,无需考虑之前的值。 自顶向下的状态转移方式代码如下:

n = int(input().strip())
data = list(map(int, input().strip().split()))
dp = [0 for _ in range(n)]
for i in range(n):
    dp[i] = data[i]
    if i >= 1:
        dp[i] = max(dp[i - 1], dp[i])
    if i >= 2:
        dp[i] = max(dp[i - 2] + data[i], dp[i - 1])
print(dp[-1])

自底向上的状态转移方式代码如下:

n = int(input().strip())
data = list(map(int, input().strip().split()))
dp = [0 for _ in range(n + 2)]
for i in range(n - 1, -1, -1):
    dp[i] = max(dp[i + 1], data[i] + dp[i + 2])
print(dp[0])
全部评论

相关推荐

肥肠椒绿:双非本可不就犯天条了,双非本就应该打入无间地狱
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务