算法:leetcode 1423. 可获得的最大点数

https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/

在这里插入图片描述

class Solution(object):
    def maxScore(self, cardPoints, k):
        """
        :type cardPoints: List[int]
        :type k: int
        :rtype: int
        """

        #方法一暴力尝试,全部用例超过时间范围:
        def methodOne(cardPoints,k):
            memory={}
            #定义process函数
            def process(cardPoints,k,left,right,cursum,tickes):
                if memory.has_key((left,right)):
                    return memory[(left,right)]
                if tickes>k:
                    memory[(left,right)]=cursum
                    return cursum #已经到k张了,不用再拿第k+1张
                if left==right:
                    #已经只剩最后一张牌了
                    tickes+=1
                    memory[(left,right)]=cursum+cardPoints[left]
                    return cursum+cardPoints[left]
                #拿左边
                p1=process(cardPoints,k,left+1,right,cursum+cardPoints[left],tickes+1)
                #拿右边
                p2=process(cardPoints,k,left,right-1,cursum+cardPoints[right],tickes+1)
                ans=max(p1,p2)
                memory[(left,right)]=ans
                return max(p1,p2)
            return process(cardPoints,k,0,len(cardPoints)-1,0,1)
        #return methodOne(cardPoints,k)
        #方法一二 可以记忆化搜索加速dp,还是超出时间限制

        #方法二,转换dp,看是否能够空间压缩,加速dp,上面暴力尝试,主要left,right两个可变参数,cursum填表,tickes其实可以通过left,right算出
        def methodTwo(cardPoints,k):
            #dp[i][j] [0...i] 和[j...len-1]的都拿的分数值
            #最终结果是j-i=k-1的所有状态值中找最大值,
            return
        #方法三,变相求固定窗口len-k大小子数组最小的部分,总和减它们就是了 最后变成范围dp
        def methodThree(cardPoints,k):
            if not cardPoints or len(cardPoints)<k:
                raise(Exception("input invalid"))
            n=len(cardPoints)
            left=0
            right=n-k-1 #下标
            fixLenSum=sum(cardPoints[0:right+1]) #固定len-k滑动窗口大小
            allSum=fixLenSum #总累计大小
            minTarget=fixLenSum
            while right<len(cardPoints)-1:
                fixLenSum-=cardPoints[right-n+k+1]
                right+=1
                fixLenSum+=cardPoints[right]
                allSum+=cardPoints[right]
                minTarget=min(fixLenSum,minTarget)
            return allSum-minTarget
        return methodThree(cardPoints,k)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值