LeetCode 1563. 石子游戏 V(DP)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 区间DP

1. 题目

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

游戏中的每一轮:

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

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

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

示例 1:
输入:stoneValue = [6,2,3,4,5,5]
输出:18
解释:在第一轮中,Alice 将行划分为 [623][455] 。
左行的值是 11 ,右行的值是 14 。
Bob 丢弃了右行,Alice 的分数现在是 11 。
在第二轮中,Alice 将行分成 [6][23] 。
这一次 Bob 扔掉了左行,Alice 的分数变成了 1611 + 5)。
最后一轮 Alice 只能将行分成 [2][3] 。
Bob 扔掉右行,Alice 的分数现在是 1816 + 2)。
游戏结束,因为这行只剩下一块石头了。示例 2:
输入:stoneValue = [7,7,7,7,7,7,7]
输出:28示例 3:
输入:stoneValue = [4]
输出:0提示:
1 <= stoneValue.length <= 500
1 <= stoneValue[i] <= 10^6

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/stone-game-v
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 区间DP

在这里插入图片描述
时间复杂度O(n3) ,有点高,需要优化

  • dp[l][r] 表示区间内可以得到的最高分,区间从小往大
  • 区间增加了,枚举中间分隔点
class Solution {
public:int stoneGameV(vector<int>& stoneValue) {int n = stoneValue.size(), i, l, r, mid, suml, sumr;vector<vector<int>> dp(n,vector<int>(n,0));vector<int> sum(stoneValue);for(i = 1; i < n; i++) sum[i] = sum[i-1] + stoneValue[i];//前缀和for(int len = 1; len < n; len++)//区间长度{for(l = 0; l < n; l++)//左端点{r = l+len;//右端点if(r >= n)continue;for(mid = l; mid < r; mid++)//枚举中间节点{suml = sum[mid]-(l==0 ? 0 : sum[l-1]);sumr = sum[r]-sum[mid];if(suml >= sumr)dp[l][r] = max(dp[l][r], dp[mid+1][r]+sumr);if(suml <= sumr)dp[l][r] = max(dp[l][r], dp[l][mid]+suml);}}}return dp[0][n-1];}
};
  • 不使用 vector,过了
class Solution {
public:int stoneGameV(vector<int>& stoneValue) {int n = stoneValue.size(), i, l, r, mid, suml, sumr;int dp[501][501];memset(dp,0,sizeof dp);int sum[501] = {0};sum[0] = stoneValue[0];for(i = 1; i < n; i++) sum[i] = sum[i-1] + stoneValue[i];for(int len = 1; len < n; len++){for(l = 0; l < n; l++){r = l+len;if(r >= n)continue;for(mid = l; mid < r; mid++){suml = sum[mid]-(l==0 ? 0 : sum[l-1]);sumr = sum[r]-sum[mid];if(suml >= sumr)dp[l][r] = max(dp[l][r], dp[mid+1][r]+sumr);if(suml <= sumr)dp[l][r] = max(dp[l][r], dp[l][mid]+suml);}}}return dp[0][n-1];}
};

1708 ms 10.6 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

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

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

相关文章

python中进程创建—fork()

导入模块&#xff1a;import os 1.程序执行到os.fork()时&#xff0c;操作系统会创建一个新的进程&#xff08;子进程&#xff09;&#xff0c;复制父进程信息 2.子进程从fork&#xff08;&#xff09;函数中得到返回值零 3.父进程从fork&#xff08;&#xff09;函数中得到返…

个人简历小程序

为了熟练掌握微信小程序开发的一些基本技巧&#xff0c;熟悉微信小程序开发流程&#xff0c;特此&#xff0c;运用所学知识&#xff0c;做了一个个人简历小程序。 效果图如下&#xff1a; 代码如下&#xff1a; ① index.jsconst app getApp() Page({ data: { userInfo: {}…

Android的Fragment介绍

前言 fragment是从android3.0开始提出来的&#xff0c;用来支持大屏幕设备的ui设计。通过将activity划分为多个fragment&#xff0c;不仅提高了设计的灵活性&#xff0c;而且可以在程序运行时改变它们的特征&#xff0c;比如动态的修改&#xff0c;替换已有的fragment等等。 fr…

[Kaggle] Heart Disease Prediction

文章目录1. 数据探索2. 特征处理管道3. 训练模型4. 预测kaggle项目地址1. 数据探索 import pandas as pd train pd.read_csv(./train.csv) test pd.read_csv(./test.csv)train.info() test.info() abs(train.corr()[target]).sort_values(ascendingFalse)<class pandas.c…

python进程的回收—wait

1.os.wait()回收资源 os.wait()方法用来回收子进程占用的资源&#xff1a; import os import time ret os.fork() # 创建新的进程 一次调用&#xff0c;两次返回 if ret 0: # 子进程执行 # 子进程拿到的返回值是0 print("子进程&#xff1a;pid%d, ppid%d" % (…

Oracle数据库逻辑存储结构管理相关问题与解决

我们在Mysql数据库中&#xff0c;一般是登入进去一个数据库&#xff0c;紧接着就创建数据库实例&#xff1a;create databse XXX;但是在Oracle数据库就不行。在数据库连接过程中老是报监听失败的错误。在备份表空间的时候&#xff0c;设置表空间为备份模式&#xff0c;它提示我…

Python调用C的方法

参考&#xff1a;http://www.cnblogs.com/fxjwind/archive/2011/07/05/2098636.html http://amazingjxq.com/2012/01/09/python%E8%B0%83%E7%94%A8c%E5%87%BD%E6%95%B0/>>>cd /home/jxq/code/gcc -fPIC -shared bob_hash.c -o bob_hash.so然后在python里面用ctypes加载…

01.神经网络和深度学习 W2.神经网络基础

文章目录1. 二分类2. 逻辑回归3. 逻辑回归损失函数4. 梯度下降5. 导数6. 计算图导数计算7. 逻辑回归中的梯度下降8. m个样本的梯度下降9. 向量化10. 向量化的更多例子11. 向量化 logistic 回归12. 向量化 logistic 回归梯度输出13. numpy 广播机制14. 关于 python / numpy 向量…

python中的孤儿进程

1.子进程未运行完父进程就结束运行退出&#xff0c;留下来的子进程就是孤儿进程 2.父进程结束退出&#xff0c;子进程会被继父收回&#xff0c;通常是int进程&#xff08;pid为1&#xff09;无危害 import os import time ret os.fork() # 创建新的进程 一次调用&#xff0…

Oracle数据库物理存储结构管理遇到的问题与解决

问题一&#xff1a;当我创建一个重做日志文件放入重做日志文件组中的时候&#xff0c;查询数据字典发现新创建的重做日志文件的状态为“不合法”。 解决方案&#xff1a; 通过查阅相关资料了解到 新建的重做日志文件组成员状态为INVALID,这是由于新建的成员文件还没有被…

实例讲解hadoop中的map/reduce查询(python语言实现)

条件&#xff0c;假设你已经装好了hadoop集群&#xff0c;配好了hdfs并可以正常运行。 $hadoop dfs -ls /data/dw/explorerFound 1 itemsdrwxrwxrwx - rsync supergroup 0 2011-11-30 01:06 /data/dw/explorer/20111129$ hadoop dfs -ls /data/dw/explo…

python中僵尸进程

⼦进程运⾏完成&#xff0c;但是⽗进程迟迟没有进⾏回收&#xff0c;此时⼦进程实际上并没有退出&#xff0c;其仍然占⽤着系统资源&#xff0c;这样的⼦进程称为僵⼫进程。 因为僵⼫进程的资源⼀直未被回收&#xff0c;造成了系统资源的浪费&#xff0c;过多的僵⼫进程将造成…

01.神经网络和深度学习 W3.浅层神经网络

文章目录1. 神经网络概览2. 神经网络的表示3. 神经网络的输出4. 多样本向量化5. 激活函数6. 为什么需要 非线性激活函数7. 激活函数的导数8. 随机初始化作业参考&#xff1a; 吴恩达视频课 深度学习笔记 1. 神经网络概览 xW[1]b[1]}⟹z[1]W[1]xb[1]⟹a[1]σ(z[1])\left.\begin…

多进程修改全局变量

多进程中&#xff0c;每个进程中所有数据&#xff08;包括全局变量&#xff09;都各有拥有⼀份&#xff0c;互不影响 (读时共享&#xff0c;写时复制) import os import time num 100 ret os.fork() # 创建新的进程 一次调用&#xff0c;两次返回 if ret 0: # 子进程…

多进程模块multiprocessing

multiprocessing模块就是跨平台版本的多进程模块&#xff0c;提供了⼀个Process类来代表一个进程对象 创建⼦进程时&#xff0c;只需要传⼊⼀个执⾏函数和函数的参数&#xff0c;创建⼀个 Process实例&#xff0c;⽤start&#xff08;&#xff09;方法启动 &#xff0c;join()…

01.神经网络和深度学习 W2.神经网络基础(作业:逻辑回归 图片识别)

文章目录编程题 11. numpy 基本函数1.1 编写 sigmoid 函数1.2 编写 sigmoid 函数的导数1.3 reshape操作1.4 标准化1.5 广播机制2. 向量化2.1 L1\L2损失函数编程题 2. 图片&#x1f431;识别1. 导入包2. 数据预览3. 算法的一般结构4. 建立算法4.1 辅助函数4.2 初始化参数4.3 前向…

PL/SQL程序设计以及安全管理实验遇到的问题及解决

问题一&#xff1a;当我书写PL/SQL语句调用所创建的函数时&#xff0c;报“此范围不存在名为XXX函数名”的错误。 解决&#xff1a; 我通过查阅相关资料&#xff0c;了解到&#xff1a;这种情况主要是调用的函数的参数或者函数名书写错误&#xff0c; 然而&#xff0c;我经过仔…

PowerDesigner使用教程 —— 概念数据模型 (转)

一、概念数据模型概述 概念数据模型也称信息模型&#xff0c;它以实体&#xff0d;联系(Entity-RelationShip,简称E-R)理论为基础&#xff0c;并对这一理论进行了扩充。它从用户的观点出发对信息进行建模&#xff0c;主要用于数据库的概念级设计。 通常人们先将现实世界抽…

进程的创建-Process⼦类

from multiprocessing import Process&#xff08;P必须大写 import os import time classSubProcess(Process): """创建Process的子类""" def __init__(self, num, a): super(SubProcess, self).__init__() # 执行父类Process默认的初始化方法…