Codility每周一课:P17. 1 NumberSolitaire

版权声明:AnFany https://blog.csdn.net/qq_32882309/article/details/87874396

0.png

P17. 1 NumberSolitaire

In a given array, find the subset of maximal sum in which the distance between consecutive elements is at most 6

  • P17.1 数字纸牌
    计算给定的数组中,索引差不大于6的数字构成的集合的和值的最大值

有个游戏是在N个方块组成的棋盘上进行的,方块编号从0到N-1。每个方块上都写着一个数字。由N个整数组成的非空数组代表这些方块上的数字。此外,一些方块在游戏中可以被标记。

游戏一开始,在0号方块上放置一块鹅卵石,也就是说0号方块被标记。游戏的目标是将鹅卵石移动到编号为N-1的方块上。

每个回合开始时,投掷一个六面骰子,6个面的数字分别为1、2、……、6,骰子停下来后,朝上一面的数字假设为K,就把在I号方块上的鹅卵石移动到I+K号方块上,前提是I+K方石块存在。如果I+K号方块不存在,则再次掷骰子直到可以移动,此时I+K号方块被标记。

当鹅卵石恰好移动到编号为N-1的方块上时,游戏结束。计算所有被放置过鹅卵石的方块上的数字之和。

例如,给定数组A:
A[0]=1,A[1]=-2,A[2]=0,A[3]=9,A[4]=-1,A[5]=-2

下面描述一次游戏过程:

  1. 开始,鹅卵石在0号方块上,此方块被标记;
  2. 掷出3;鹅卵石从0号移动到3号方块,3号方块被标记;
  3. 掷出5,因为3+5=8,8号方块不存在。继续掷骰子;
  4. 掷出2;鹅卵石移动到5号方块,5号方块被标记;
  5. 游戏结束;

标记的方块是0、3和5,所以游戏的结果是1+9+(−2)=8。同时这也是在这个棋盘上进行游戏得到的结果的最大值。

编写函数:

def solution(A)

给定一个由N个整数组成的非空数组A,则返回在由数组A表示的棋盘上可以得到的最大结果。例如,针对给出的例子,函数应该返回8。

假定:

  1. N是区间[2,100,000]内的整数;
  2. 数组A的每个元素都是区间[-10,000,10,000]内的整数;
  • 解题思路

利用动态规划的思想(参见)。现在考虑移动一步就可以游戏结束的情况,如下图所示:

image

假设到达编号为I的最大值为M(I),因此只要计算出M(N-7)、M(N-6)、……、M(N-2)中的最大值,就可得到最终的结果M(N-1)。同理对于计算达到N-2号方块的最大值M(N-2),只要计算出M(N-8)、M(N-7)、……、M(N-3)中的最大值即可,依次类推。注意:程序中要始终维护一个长度为6的存储前面位置最大值的序列。

  • Python3代码
# -*- coding:utf-8 -*-
# &Author  AnFany
# Lesson 17:Dynamic programming
# P 17.1 NumberSolitaire


def solution(A):
    """
    计算数组A中,索引差不大于6的数字构成的集合中,和值的最大值
    :param A: 数组
    :return: 和值绝对值的最大值
    """
    max_num_list = [A[0]]
    for value in A[1:-1]:
        if len(max_num_list) < 6:
            max_num_list.append(max(max_num_list) + value)
        else:
            max_num_list.append(max(max_num_list) + value)
            max_num_list.pop(0)
    return max(max_num_list) + A[-1]
  • 结果

17.1.png
点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。

image

image

猜你喜欢

转载自blog.csdn.net/qq_32882309/article/details/87874396