当前位置: 首页 > news >正文

算法60---石子游戏【动态规划】

一、题目:

亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。

游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。

亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。

假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。

 

示例:

输入:[5,3,4,5]
输出:true
解释:
亚历克斯先开始,只能拿前 5 颗或后 5 颗石子 。
假设他取了前 5 颗,这一行就变成了 [3,4,5] 。
如果李拿走前 3 颗,那么剩下的是 [4,5],亚历克斯拿走后 5 颗赢得 10 分。
如果李拿走后 5 颗,那么剩下的是 [3,4],亚历克斯拿走后 4 颗赢得 9 分。
这表明,取前 5 颗石子对亚历克斯来说是一个胜利的举动,所以我们返回 true 。

 

提示:

  1. 2 <= piles.length <= 500
  2. piles.length 是偶数。
  3. 1 <= piles[i] <= 500
  4. sum(piles) 是奇数。

思路:动态规划:时间O(N^2),空间O(N^2)

  • dp[i][j]表示:表示在piles中下标 i 至下标 j 之间的玩家1 所拿石子总数和 玩家2所拿石子总数之差。dp[i][j] > 0 表明玩家1赢,输出True
  • 子问题:dp[ i+1 ][ j ]和dp[ i ][ j-1 ]
  • 初始状态:dp的初始状态是 i = j 即只有一个石子堆,由于玩家1先拿,则 dp[ i ][ j ] = piles[ i ]
  • 状态方程:

dp[ i ][ j ] = max( piles[ i ] - dp[ i+1 ][ j ], piles[ j ] - dp[ i ][ j-1 ])

【解释:当玩家1拿了最左边下标为 i 的石子后,玩家1和玩家2的石子数之差为 piles[ i ] - dp[ i+1 ][ j ], 当玩家1拿了最右边下标为j的那堆石子后,玩家1和玩家2的石子数之差为 piles[ j ] - dp[ i ][ j-1 ], 取其中较大者为新的最优解。】

 

代码:

def stronegame(piles):
    n = len(piles)
    dp = [[0] * n for i in range(n)]
    for i in range(n):
        dp[i][i] = piles[i]
    for i in range(n-2,-1,-1):
        for j in range(i+1,n):
            dp[i][j] = max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1])
    return dp[0][-1] > 0
piles = [5,3,4,5]
stronegame(piles)

 

转载于:https://www.cnblogs.com/Lee-yl/p/9984090.html

相关文章:

  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • Swift 设置navigation左右两侧按钮
  • JavaEE异常
  • jQuery根据元素值删除数组元素的方法
  • 简单的原生ajax
  • restful命名
  • android Lifecycle源码分析--源码阅读100天(1)
  • Java-TreeSet的用法-入门
  • (四)鸿鹄云架构一服务注册中心
  • 占位子,考完试写
  • golang学习笔记 ---命令行参数
  • 森林病虫防治系统 (结束)
  • Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解【转】...
  • 计算机
  • lucene4.7学习总结
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • JavaScript DOM 10 - 滚动
  • JS专题之继承
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 飞驰在Mesos的涡轮引擎上
  • 排序算法学习笔记
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 日剧·日综资源集合(建议收藏)
  • 如何学习JavaEE,项目又该如何做?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 原生Ajax
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 进程与线程(三)——进程/线程间通信
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​io --- 处理流的核心工具​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • (175)FPGA门控时钟技术
  • (6)STL算法之转换
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (九)One-Wire总线-DS18B20
  • (六)软件测试分工
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (学习日记)2024.01.19
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)创业的注意事项
  • (转)一些感悟
  • (转载)OpenStack Hacker养成指南
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析