Python每日一练(20230509) 石子游戏 IV\V\VI

news2024/9/24 15:25:52

目录

1. 石子游戏 Stone Game IV

2. 石子游戏 Stone Game V

3. 石子游戏 Stone Game VI

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 石子游戏 Stone Game IV

Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。

一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。

如果石子堆里没有石子了,则无法操作的玩家输掉游戏。

给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。

示例 1:

输入:n = 1
输出:true
解释:Alice 拿走 1 个石子并赢得胜利,因为 Bob 无法进行任何操作。

示例 2:

输入:n = 2
输出:false
解释:Alice 只能拿走 1 个石子,然后 Bob 拿走最后一个石子并赢得胜利(2 -> 1 -> 0)。

示例 3:

输入:n = 4
输出:true
解释:n 已经是一个平方数,Alice 可以一次全拿掉 4 个石子并赢得胜利(4 -> 0)。

示例 4:

输入:n = 7
输出:false
解释:当 Bob 采取最优策略时,Alice 无法赢得比赛。
如果 Alice 一开始拿走 4 个石子, Bob 会拿走 1 个石子,然后 Alice 只能拿走 1 个石子,Bob 拿走最后一个石子并赢得胜利(7 -> 3 -> 2 -> 1 -> 0)。
如果 Alice 一开始拿走 1 个石子, Bob 会拿走 4 个石子,然后 Alice 只能拿走 1 个石子,Bob 拿走最后一个石子并赢得胜利(7 -> 6 -> 2 -> 1 -> 0)。

示例 5:

输入:n = 17
输出:false
解释:如果 Bob 采取最优策略,Alice 无法赢得胜利。

提示:

  • 1 <= n <= 10^5

代码:

class Solution:
    def stoneGameIV(self, n: int) -> bool:
        dp = [False] * (n + 1)
        for i in range(1, n + 1):
            for j in range(1, int(i**0.5) + 1):
                if not dp[i - j*j]:
                    dp[i] = True
                    break
        return dp[n]

#%%
s = Solution()
print(s.stoneGameIV(1))
print(s.stoneGameIV(2))
print(s.stoneGameIV(4))
print(s.stoneGameIV(7))
print(s.stoneGameIV(17))

输出:

True
False
True
False
False


2. 石子游戏 Stone Game V

几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。

游戏中的每一轮:Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行);Bob 负责计算每一行的值,即此行中所有石子的值的总和。Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。如果两行的值相等,Bob 让 Alice 决定丢弃哪一行。下一轮从剩下的那一行开始。

只 剩下一块石子 时,游戏结束。Alice 的分数最初为 0 。

返回 Alice 能够获得的最大分数 。

示例 1:

输入:stoneValue = [6,2,3,4,5,5]
输出:18
解释:在第一轮中,Alice 将行划分为 [6,2,3],[4,5,5] 。左行的值是 11 ,右行的值是 14 。Bob 丢弃了右行,Alice 的分数现在是 11 。
在第二轮中,Alice 将行分成 [6],[2,3] 。这一次 Bob 扔掉了左行,Alice 的分数变成了 16(11 + 5)。
最后一轮 Alice 只能将行分成 [2],[3] 。Bob 扔掉右行,Alice 的分数现在是 18(16 + 2)。游戏结束,因为这行只剩下一块石头了。

示例 2:

输入:stoneValue = [7,7,7,7,7,7,7]
输出:28

示例 3:

输入:stoneValue = [4]
输出:0

提示:

  • 1 <= stoneValue.length <= 500
  • 1 <= stoneValue[i] <= 10^6

代码1: 动态规划

from typing import List
class Solution:
    def stoneGameV(self, stoneValue: List[int]) -> int:
        n = len(stoneValue)
        presum = [0] * (n + 1)
        for i in range(n):
            presum[i + 1] = presum[i] + stoneValue[i]
        dp = [[0] * n for _ in range(n)]
        for i in range(n):
            dp[i][i] = 0
        for i in range(n - 2, -1, -1):
            for j in range(i + 1, n):
                for k in range(i, j):
                    leftsum = presum[k + 1] - presum[i]
                    rightsum = presum[j + 1] - presum[k + 1]
                    if leftsum < rightsum:
                        dp[i][j] = max(dp[i][j], dp[i][k] + leftsum)
                    elif leftsum > rightsum:
                        dp[i][j] = max(dp[i][j], dp[k + 1][j] + rightsum)
                    else:
                        dp[i][j] = max(dp[i][j], dp[i][k] + leftsum, dp[k + 1][j] + rightsum)
        return dp[0][n - 1]

#%%
s = Solution()
stoneValue = [6,2,3,4,5,5]
print(s.stoneGameV(stoneValue))
stoneValue = [7,7,7,7,7,7,7]
print(s.stoneGameV(stoneValue))

代码2: 记忆化搜索

from typing import List
class Solution:
    def stoneGameV(self, stoneValue: List[int]) -> int:
        n = len(stoneValue)
        presum = [0] * (n + 1)
        for i in range(n):
            presum[i + 1] = presum[i] + stoneValue[i]
        memo = [[-1] * n for _ in range(n)]
        def dfs(i, j):
            if memo[i][j] != -1:
                return memo[i][j]
            if i == j:
                memo[i][j] = 0
                return 0
            res = 0
            for k in range(i, j):
                leftsum = presum[k + 1] - presum[i]
                rightsum = presum[j + 1] - presum[k + 1]
                if leftsum < rightsum:
                    res = max(res, dfs(i, k) + leftsum)
                elif leftsum > rightsum:
                    res = max(res, dfs(k + 1, j) + rightsum)
                else:
                    res = max(res, dfs(i, k) + leftsum, dfs(k + 1, j) + rightsum)
            memo[i][j] = res
            return res
        return dfs(0, n - 1)

#%%
s = Solution()
stoneValue = [6,2,3,4,5,5]
print(s.stoneGameV(stoneValue))
stoneValue = [7,7,7,7,7,7,7]
print(s.stoneGameV(stoneValue))

输出:

18
28


3. 石子游戏 Stone Game VI

Alice 和 Bob 轮流玩一个游戏,Alice 先手。

一堆石子里总共有 n 个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。

给你两个长度为 n 的整数数组 aliceValues 和 bobValues 。aliceValues[i] 和 bobValues[i] 分别表示 Alice 和 Bob 认为第 i 个石子的价值。

所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平局。两位玩家都会采用 最优策略 进行游戏。

请你推断游戏的结果,用如下的方式表示:

  • 如果 Alice 赢,返回 1 。
  • 如果 Bob 赢,返回 -1 。
  • 如果游戏平局,返回 0 。

示例 1:

输入:aliceValues = [1,3], bobValues = [2,1]
输出:1
解释:
如果 Alice 拿石子 1 (下标从 0开始),那么 Alice 可以得到 3 分。
Bob 只能选择石子 0 ,得到 2 分。
Alice 获胜。

示例 2:

输入:aliceValues = [1,2], bobValues = [3,1]
输出:0
解释:
Alice 拿石子 0 , Bob 拿石子 1 ,他们得分都为 1 分。
打平。

示例 3:

输入:aliceValues = [2,4,3], bobValues = [1,6,7]
输出:-1
解释:
不管 Alice 怎么操作,Bob 都可以得到比 Alice 更高的得分。
比方说,Alice 拿石子 1 ,Bob 拿石子 2 , Alice 拿石子 0 ,Alice 会得到 6 分而 Bob 得分为 7 分。
Bob 会获胜。

提示:

  • n == aliceValues.length == bobValues.length
  • 1 <= n <= 105
  • 1 <= aliceValues[i], bobValues[i] <= 100

代码1: 动态规划

from typing import List
class Solution:
    def stoneGameVI(self, aliceValues: List[int], bobValues: List[int]) -> int:
        n = len(aliceValues)
        total_values = [(aliceValues[i] + bobValues[i], i) for i in range(n)]
        total_values.sort(reverse=True)
        alice_dp, bob_dp = [0] * (n + 1), [0] * (n + 1)
        for i in range(n):
            if i % 2 == 0:
                alice_dp[i // 2 + 1] = alice_dp[i // 2] + aliceValues[total_values[i][1]]
            else:
                bob_dp[i // 2 + 1] = bob_dp[i // 2] + bobValues[total_values[i][1]]
        for i in range(n // 2):
            alice_dp[i + 1] = max(alice_dp[i], alice_dp[i + 1])
            bob_dp[i + 1] = max(bob_dp[i], bob_dp[i + 1])
        diff = alice_dp[n // 2] - bob_dp[n // 2]
        if diff > 0:
            return 1
        elif diff < 0:
            return -1
        else:
            return 0

#%%
s = Solution()
aliceValues = [1,3]
bobValues = [2,1]
print(s.stoneGameVI(aliceValues, bobValues))
aliceValues = [1,2]
bobValues = [3,1]
print(s.stoneGameVI(aliceValues, bobValues))
aliceValues = [2,4,3]
bobValues = [1,6,7]
print(s.stoneGameVI(aliceValues, bobValues))

代码2: 贪心算法

from typing import List
class Solution:
    def stoneGameVI(self, aliceValues: List[int], bobValues: List[int]) -> int:
        n = len(aliceValues)
        stones = [(aliceValues[i] + bobValues[i], i) for i in range(n)]
        stones.sort(reverse=True)
        a_score, b_score = 0, 0
        for i in range(n):
            if i % 2 == 0:
                a_score += aliceValues[stones[i][1]]
            else:
                b_score += bobValues[stones[i][1]]
        if a_score > b_score:
            return 1
        elif a_score < b_score:
            return -1
        else:
            return 0

#%%
s = Solution()
aliceValues = [1,3]
bobValues = [2,1]
print(s.stoneGameVI(aliceValues, bobValues))
aliceValues = [1,2]
bobValues = [3,1]
print(s.stoneGameVI(aliceValues, bobValues))
aliceValues = [2,4,3]
bobValues = [1,6,7]
print(s.stoneGameVI(aliceValues, bobValues))

输出:

1
0
-1


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon与Qt联合编程方法二(C++版本)

上一篇文章中提到基于python实现Halcon与Qt联合编程&#xff0c;但是在实际开发中&#xff0c;比如说已经有了qt编写的c版软件进行算法迭代&#xff0c;或者已经有了halcon编写的&#xff08;.hdev文件&#xff09;算法&#xff0c;想进行软件封装&#xff0c;这时候可以考虑把…

怎么把pdf中的某一页分出来?

怎么把pdf中的某一页分出来&#xff1f;PDF格式的文档在日常生活中是非常常见的&#xff0c;相信大家都对其有所了解&#xff0c;并且经常使用。它的主要特点是不允许用户随意编辑其中的内容&#xff0c;当我们仅需要阅读时&#xff0c;PDF文档无疑是十分方便的&#xff0c;尤其…

Linux Docker部署SpringCloud

Linux Docker部署SpringCloud 1 项目介绍2 快速部署2.1 api-registry2.1 api-gateway2.1 api-provider2.1 api-consumer 1 项目介绍 这是一个典型的springcloud项目架构&#xff0c;api-registry为注册中心&#xff0c;api-gateway为网关&#xff0c;api-provider为服务提供者&…

什么是域名流量劫持?

作为传统的互联网攻击方式&#xff0c;域名流量劫持已经十分常见&#xff0c;这种网络攻击将会在不经授权的情况下控制或重定向一个域名的DNS记录。域名劫持的影响难以估量&#xff0c;因为它可以导致在访问一个网站时&#xff0c;用户被引导到另一个不相关的网站&#xff0c;对…

uniapp collapse 一键收起

文章目录 前言一、源码二、方法1.部分代码2.原理 总结 前言 官方文档没有提供 说明&#xff0c;就研究源码&#xff0c;终于花了半上午的时间&#xff0c;找到了一种方法&#xff0c;可能不是很好用&#xff0c;但也可以用 一、源码 主要是这个方法&#xff0c;这个方法是用来…

劳动节程序员应该知道的知识——计算机

前言 现在AI崛起&#xff0c;计算机已经成为我们不可或缺的一部分&#xff0c;几乎在所有行业和领域都有广泛应用 。 五一已经快要过去了&#xff0c;程序员们应该都放假了&#xff0c;那我们是不是应该去了解了解我们的伙伴——计算机&#xff0c;了去解计算机是怎样工作的&am…

TokenGT:Transformer是强大的图学习器

论文标题&#xff1a;Pure Transformers are Powerful Graph Learners 论文链接&#xff1a;https://arxiv.org/abs/2207.02505 论文来源&#xff1a;NIPS 2022 一、概述 由于Transformer的完全注意力架构接收、处理和关联任意结构的输入和输出的能力&#xff0c;消除了将特定于…

(五)如何实现TCP连接传输用户个人资料及头像(Base64编码)

文章目录 一、引言1.1 即时通信系统中用户个人资料的重要性1.2 使用TCP连接传输用户个人资料的基本原理及Base64编码的应用 二、实现TCP连接传输用户个人资料2.1 使用QTcpSocket和QTcpServer类实现TCP连接关键代码展示 2.2 实现用户个人资料的传输关键代码展示 三、解码接收到的…

分享31个游戏源代码总有一个是你想要的

下载地址&#xff1a;分享31个游戏源代码总有一个是你想要的(亲测每一个均可用) 分享13个游戏源代码总有一个是你想要的 收集整理不容易老铁支持我动力&#xff01; 下面是项目的名字&#xff0c;我放了一些图片&#xff0c;大家下载后可以看到。 c#版植物大战僵尸 Html5网页…

启智收获优秀合作伙伴奖,再次协办千万奖金的昇腾AI创新大赛2023

5月6日-7日&#xff0c;以“创未来 享非凡”为主题的鲲鹏昇腾开发者峰会2023在东莞松山湖举办。 6日晚间&#xff0c;在著有“欧洲小镇”美名的溪流背坡村其中一处迷人景点湖心广场处&#xff0c;华为举办了一场“鲲鹏昇腾开发者之夜”的晚会盛宴&#xff0c;有绚烂灯光下的闪耀…

甘特图控件DHTMLX Gantt入门使用教程【引入】:dhtmlxGantt 与 ASP.NET MVC(上)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

6. 构造函数和析构函数

一、对象的初始化和清理 C中的面向对象来源于生活&#xff0c;每个对象也都会有初始设置以及对象销毁前的清理数据的设置&#xff0c;对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态&#xff0c;对其使用后果是未知的使用完一个对象或变量&#x…

利用LSTM(Long Short-Term Memory)进行回归预测的原理和python代码

文章目录 一、LSTM&#xff08;Long Short-Term Memory&#xff09;是什么&#xff1f;二、使用LSTM进行回归预测时需要以下几个步骤1.数据预处理&#xff1a;2.构建LSTM模型&#xff1a;3.模型训练&#xff1a;4.模型预测&#xff1a; 三、Python实现的简单LSTM回归预测程序代…

复用,多址的区分以及其涉及的相关数据速率

复用技术 为了让尽可能多的手机使用同一个频段&#xff0c;无线通信设计了多址复用技术&#xff1a; 时分多路复用&#xff08;Time Division Multiplexing&#xff0c;TDM)要求各个子通道按时间片轮流地占用整个带宽。时间片的大小可以按一次传送一位、一个字节或一个固定大…

Hudi学习1:概述

Hudi 概念 Apache Hudi 是一个支持插入、更新、删除的增量数据湖处理框架&#xff0c;有两种表类型&#xff1a;COW和MOR&#xff0c;可以自动合并小文件&#xff0c;Hudi自己管理元数据&#xff0c;元数据目录为.hoodie。 Hudi提供表、事务、高效的追加/删除、高级索引、流接收…

【全栈第一课】微信小程序从入门到精通

微信小程序 1. 环境准备2. 小程序结构目录2.1 小程序和传统web文件结构对比2.2 基本的项目目录 3. 配置文件JSON3.1 [全局配置app.json](https://developers.weixin.qq.com/miniprogram/dev/framework/config.html)3.2 [页面配置page.json](https://developers.weixin.qq.com/m…

【标准化方法】(2) Layer Normalization 原理解析、代码复现,附Pytorch代码

大家好&#xff0c;今天和各位分享一下深度学习中常见的标准化方法&#xff0c;在 Transformer 模型中常用的 Layer Normalization&#xff0c;从数学公式的角度复现一下代码。 看本节前建议各位先看一下 Batch Normalization&#xff1a;https://blog.csdn.net/dgvv4/article…

用友携国资国企走进浙江龙游,共探区县国资智慧监管新样板

近日&#xff0c;由龙游县国有资产经营有限公司指导&#xff0c;用友网络科技股份有限公司&#xff08;以下简称&#xff1a;用友网络&#xff09;主办的“成为数智企业 迈向高质量发展——2023走进龙游数智化观摩研讨会”在浙江龙游成功举办&#xff01;全国近百位国资国企负责…

Cocos Creator 3.x 热更新,使用chatgpt快速定位解决问题

为什么要使用app热更 使用 app 热更的主要原因是可以快速地向用户推送应用程序的更新版本&#xff0c;同时也可以减少应用程序更新时需要用户手动下载和安装的次数&#xff0c;从而提高用户体验和应用程序的可维护性。以下是一些使用 app 热更的好处&#xff1a; 快速发布更新…

react初始化配置rem,less,@,本地代理,通配符,视口单位等

初始化项目之后&#xff0c;项目配置中默认配置的是scss 想用less就需要单独配置了&#xff0c;在做一个完整的项目情况下create-react-app搭出来架子的配置往往是不够的至少需要简单配置以下信息 暴露webpack之后会增加很多文件和依赖配置&#xff0c;有些时候并不想把它暴露出…