题目描述:

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

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

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

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

输入

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)。游戏结束,因为这行只剩下一块石头了。

class Solution {// 区间DPint MAX_N = 500 + 10;int[][] dp = new int[MAX_N][MAX_N];public int stoneGameV(int[] s) {int n = s.length;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)dp[i][j] = -1;return dfs(s, 0, n - 1);}public int dfs(int[] s, int l, int r) {if (l == r) return 0;if (dp[l][r] != -1) return dp[l][r];int sum = 0;  // 当前区间[l, r]的总和for (int k = l; k <= r; k++) sum += s[k];int max = 0;  // 当前区间[l, r]的最大收益int cur = 0;  // 切割后的前半段区间和[l, mid]for (int mid = l; mid < r; mid++) {  // mid表示切割点int ret = 0;  // 以mid为切割点的当前收益cur += s[mid];if (cur < sum - cur) {ret = cur + dfs(s, l, mid);}else {if (cur > sum - cur) {ret = sum - cur + dfs(s, mid + 1, r);}else {ret = cur + Math.max(dfs(s, l, mid), dfs(s, mid + 1, r));}}max = Math.max(max, ret);}return dp[l][r] = max;}
}

区间DP--LeetCode5498石子游戏相关推荐

  1. 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★

    P3147 [USACO16OPEN]262144 P 想到合并,自然就想到区间dp,一个被合成的数之前是一个区间,并且由两个数比它小 111 的区间合成.可麻烦的是,我们并不知道之前的两个区间长度各 ...

  2. Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp

    文章目录 题目分析 状态表示 状态转移 题目链接 题目分析 补充博弈论的做题想法:让最坏情况下最好.在很多决策中,考虑所有的最坏情况,选其中最好的一个. 本题分析: 刚开始因为是个贪心题目,两个人每次 ...

  3. LeetCode 1690. 石子游戏 VII(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获 ...

  4. LeetCode 1563. 石子游戏 V(DP)

    文章目录 1. 题目 2. 解题 2.1 区间DP 1. 题目 几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出. 游戏中的每一轮: Alice 会将这行 ...

  5. bzoj 1413: [ZJOI2009]取石子游戏(博弈+DP)

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 711  Solved: 470 [Submit][Sta ...

  6. 【区间DP+高精】codevs1166 矩阵取数游戏题解

    转自: [ametake版权所有]http://blog.csdn.net/ametake欢迎来看 http://blog.csdn.net/ametake/article/details/47664 ...

  7. 【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

    题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏 ...

  8. CSP认证201612-4 压缩编码[C++题解]:区间dp、huffman树、石子合并

    题目分析 来源:acwing 分析: 本题难在想到是区间dp.想到区间dp之后,这就是石子合并的代码直接默写. 那么是如何建模的呢?我们把huffman编码(这里要求按照字典序大小编码,和huffma ...

  9. 合并石子 区间dp水题

    合并石子 链接: nyoj 737 描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N- ...

  10. [蓝桥杯][算法提高VIP]合并石子(区间dp+平行四边形优化)

    题目描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子合并成一堆的最小花费. 输入 输入第一行包含一个整数 ...

最新文章

  1. 【 Notes 】NLS ALGORITHMS of TOA - Based Positioning
  2. 12 Useful Tips for Machine Learning (转载)
  3. OAuth2.0相关知识
  4. 怎么将py文件转成dll_怎么将多个PPT同时转成PDF?
  5. html 对话框 flatballoon,CSS纯样式实现箭头、对话框等形状
  6. xp故障恢复控制台和它的命令
  7. c#数组获取元素的索引_获取元素集合 从C#中的指定索引
  8. linux 串口 vmin vtime ,Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用
  9. 树莓派 树莓派 编c++_树莓派6年
  10. 学习vue3系列reactive
  11. 表单出现提交两次的问题的解决
  12. /usr/bin/ld: cannot find -l*
  13. matplotlib常用绘图方法【转】
  14. Java实现网上书店管理系统(idea+MySQL+navicat)
  15. 完美数Python解法
  16. MATLAB代码:基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法 关键词:合作博弈 纳什谈判 风–光–氢系统 综合能源
  17. php流光字,《留言板寄语流光字》_留言板寄语流光字_NEWS下载网
  18. Milvus带你实现轻松搭建以图搜图系统
  19. (已更新)最新王者荣耀英雄图鉴小程序源码,包含王者中各大板块内容介绍
  20. nginx服务器,访问目录下php文档会直接下载,而不是转到页面

热门文章

  1. C++在视图中显示缩略图
  2. Mac M1安装fish shell 遇见的坑
  3. 怎么解决这个问题?救救孩子吧
  4. 软件质量测试大作业示例
  5. 将WINDOWS服务里的服务创建快捷方式到桌面
  6. 工业物联网安全需要一揽子服务商
  7. 前阿里大佬干货分享,0基础小白,转行必看Python学习笔记(七)
  8. 大数据课程培训大纲详解,大数据培训学习内容
  9. 计算机网络物联,物联网计算机网络安全及控制
  10. Walle多渠道打包