Leetcode每日一题:1388. 3n 块披萨(2023.8.18 C++)

news2024/12/25 9:14:25

目录

1388. 3n 块披萨

问题描述:

实现代码与解析:    

动态规划

原理思路:


1388. 3n 块披萨

问题描述:

给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨:

  • 你挑选 任意 一块披萨。
  • Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。
  • Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨。
  • 重复上述过程直到没有披萨剩下。

每一块披萨的大小按顺时针方向由循环数组 slices 表示。

请你返回你可以获得的披萨大小总和的最大值。

示例 1:

输入:slices = [1,2,3,4,5,6]
输出:10
解释:选择大小为 4 的披萨,Alice 和 Bob 分别挑选大小为 3 和 5 的披萨。然后你选择大小为 6 的披萨,Alice 和 Bob 分别挑选大小为 2 和 1 的披萨。你获得的披萨总大小为 4 + 6 = 10 。

示例 2:

输入:slices = [8,9,8,6,1,1]
输出:16
解释:两轮都选大小为 8 的披萨。如果你选择大小为 9 的披萨,你的朋友们就会选择大小为 8 的披萨,这种情况下你的总和不是最大的。

提示:

  • 1 <= slices.length <= 500
  • slices.length % 3 == 0
  • 1 <= slices[i] <= 1000

实现代码与解析:    

动态规划

class Solution {
public:
    int dp(vector<int> slices)
    {
        int n = slices.size();
        // f[i][j] 前 i 个披萨中选了 j 个的最大值
        vector<vector<int>> f(n, vector<int>((n + 1) / 3 + 1, 0));

        f[0][0] = 0; // 第 1 个不拿,大小为0
        f[0][1] = slices[0]; // 第一个拿
        f[1][0] = 0; // 第 2 个 不拿
        f[1][1] = max(slices[0], slices[1]);

        for (int i = 2; i < n; i++)
        {
            f[i][0] = 0; // 一个不选是0
            for (int j = 1; j <= (n + 1) / 3; j++)
                f[i][j] = max(f[i - 2][j - 1] + slices[i], f[i - 1][j]);
        }
        
        return f[n - 1][(n + 1) / 3];
    }
    int maxSizeSlices(vector<int>& slices) {

        vector<int> slices1(slices.begin() + 1, slices.end());
        vector<int> slices2(slices.begin(), slices.end() - 1);

        int res1 = dp(slices1);
        int res2 = dp(slices2);

        return max(res1, res2);   
    }
};

原理思路:

        很显然是动态规划的题。

        首先,解析题目含义,也就是选取了一块披萨后,其相邻的披萨不能选取。所以题目就转换成,在n块披萨中选取n / 3个不相邻披萨所能获得的最大值,我们最好在考虑环的问题。

        dp数组 f [ i ][ j ] 含义:从前 i 个披萨中选了 j 个的最大值;

        初始化:因为选取的是不相邻的,所以后一个状态肯定要用到前两个状态,所以我们初始化前两个中的4种状态。

f[0][0] = 0; // 第 1 个不拿,大小为0
f[0][1] = slices[0]; // 第一个拿
f[1][0] = 0; // 第 2 个 不拿
f[1][1] = max(slices[0], slices[1]);

        递推式就很好写了:第 i 个不选,那就取 i 时的最大值即可,选取的,就选 i - 2 时的最大值加上当前披萨的大小即可,两种状态取一个最大值。

f[i][j] = max(f[i - 2][j - 1] + slices[i], f[i - 1][j]);

        最后就是环的处理,考虑两种情况,一种是只考虑第一个,一种是只考虑最后一个,也是最后两种情况取一个最大值即可。

vector<int> slices1(slices.begin() + 1, slices.end());
vector<int> slices2(slices.begin(), slices.end() - 1);

int res1 = dp(slices1);
int res2 = dp(slices2);

return max(res1, res2);  

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

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

相关文章

【MT32F006】MT32F006之HT1628驱动LED

本文最后修改时间&#xff1a;2023年03月30日 一、本节简介 本文介绍如何使用MT32F006连接HT1628芯片驱动LED。 二、实验平台 库版本&#xff1a;V1.0.0 编译软件&#xff1a;MDK5.37 硬件平台&#xff1a;MT32F006开发板&#xff08;主芯片MT32F006&#xff09; 仿真器&a…

【实用黑科技】如何 把b站的缓存视频弄到本地——数据恢复软件WinHex 和 音视频转码程序FFmpeg

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;效率…

Mathematica(42)-计算N个数值的和

比如&#xff0c;我们要用Mathematica求得到下面的式子&#xff1a; 这就需要用到一个函数&#xff1a;Sum 具体地&#xff0c;Sum函数的使用形式如下&#xff1a; 因此&#xff0c;按照公式就可以得到下面的结果&#xff1a; 如果&#xff0c;我们想要将求和号也加进去&#…

三肽-32——修复受损肌肤

简介 昼夜节律是自然界最普遍的一种自然现象, 它的存在使生物体的生理、生化、行为等生命现象表现为以24小时为周期的振荡。昼夜节律发生的物质基础是分子计时器, 即昼夜节律生物钟(circadian clock) 。它由一组特异的核心元件组成, 包括CLOCK (Circadian Locomotor Output Cy…

公路桥梁有哪些安全隐患?

在现代社会&#xff0c;公路桥梁作为连接城市、串联交通的重要纽带&#xff0c;扮演着无可替代的角色。然而&#xff0c;我们常常忽视的是&#xff0c;这些高架构筑物也存在着潜在的安全隐患&#xff0c;可能随时影响着交通的畅通和人们的生命财产安全。为了更好地认识和理解这…

基于百度文心大模型创作的实践与谈论

文心概念 百度文心大模型源于产业、服务于产业&#xff0c;是产业级知识增强大模型。百度通过大模型与国产深度学习框架融合发展&#xff0c;打造了自主创新的AI底座&#xff0c;大幅降低了AI开发和应用的门槛&#xff0c;满足真实场景中的应用需求&#xff0c;真正发挥大模型…

chatglm llm实时流api接口及post访问

参考&#xff1a; https://github.com/THUDM/ChatGLM-6B/pull/573/commits/02947052eefe392fd9f9632894e9551a805c6109 https://github.com/THUDM/ChatGLM-6B/pull/573 1、代码&#xff1a; 提前安装&#xff1a; sse_starlette、fastapi python stream_api.pystream_api.p…

Linux:如何挂载Window的共享目录

本文介绍的方法操作简单快捷&#xff0c;实用性强。下面就让小编来带大家学习“Linux下怎么挂载Window中的共享目录”吧! 一、在Window下创建共享目录 1、首先&#xff0c;在Window下创建一个目录作为共享目录&#xff0c;此处创建的目录名为ShareDir 2、右键目录&#xff0c…

创建密码库/创建用户帐户/更新 Ansible 库的密钥/ 配置cron作业

目录 创建密码库 创建用户帐户 更新 Ansible 库的密钥 配置cron作业 创建密码库 按照下方所述&#xff0c;创建一个 Ansible 库来存储用户密码&#xff1a; 库名称为 /home/curtis/ansible/locker.yml 库中含有两个变量&#xff0c;名称如下&#xff1a; pw_developer&#…

LiveCharts 直方图详解,安装和使用,以及常用属性的说明

LiveCharts 直方图详解 LiveCharts 概述安装 LiveCharts 及 如何使用直方图 LineSeries 属性说明综合直方图小例子 LiveCharts 概述 LiveCharts是一个比较漂亮的WPF图表控件&#xff0c;在数据变化时还会有动画切换的效果&#xff0c;并且样式也可以控制。 安装 LiveCharts 及…

mysql 插入数据锁等待超时报错:Lock wait timeout exceeded; try restarting transaction

报错信息 Lock wait timeout exceeded; try restarting transaction 锁等待超时 Lock wait timeout exceeded; try restarting transaction&#xff0c;是当前事务在等待其它事务释放锁资源造成的 解决办法 1、数据库中执行如下sql&#xff0c;查看当前数据库的线程情况&…

【数据结构OJ题】环形链表II

原题链接&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/description/ 1. 题目描述 2. 思路分析 如果链表存在环&#xff0c;则fast和slow会在环内相遇&#xff0c;定义相遇点到入口点的距离为X&#xff0c;定义环的长度为C&#xff0c;定义头到入口的距离为…

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 摘要当前的检测sota模型网络架构swin Transformer和Vision Transformer的不同之处整体架构Patch Partition结构Linear Embedding结构Swin Transformer Block结构 Patch MergingW-MSAMSA模块计算量W-M…

学术论文翻译攻略:哪家公司最靠谱?

学术论文是针对科学领域中的学术问题进行研究的理论文章&#xff0c;其目的是表述科研成果。在权威平台上发布学术论文通常要求翻译为英文文稿。那么&#xff0c;如何翻译学术论文&#xff0c;以及哪家公司在翻译学术性论文方面表现最好&#xff1f; 业内人士指出&#xff0c;学…

PSP - 扩散生成模型 (Diffusion Generative Model) 预测蛋白质结构 EigenFold 算法与环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132357976 Paper: EigenFold: Generative Protein Structure Prediction with Diffusion Models EigenFold 是用于蛋白质结构预测的扩散生成模型…

Intel CPU E-core 和P-core 介绍

多年来&#xff0c;计算机 CPU 中的内核一直在以稳定的速度发展。我们最初有单核 CPU&#xff0c;但很快发展到多线程&#xff0c;然后从那里开始多核设置&#xff0c;从双核设计开始&#xff0c;然后推出四核、八核等。 英特尔的第 12 代 CPU 给我们带来了意想不到的惊喜&…

微信小程序拉起支付报: 调用支付JSAPI缺少参数: total_fee

1. 调用支付JSAPI缺少参数: total_fee 2. 检查返回给前端调起支付的参数是否正确 一开始是params.put("package", prepay_id); 回来改回params.put("package", "prepay_id"prepay_id);

LeetCode刷题——46.全排列

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 【递归实现】 func permute(nums []int) [][]int {var permutation func([]int, int, int)r : make([][]int,0)permutation func(arr []int, start int,…

【动态规划】两个数组问题

文章目录 动态规划&#xff08;两个数组问题&#xff09;1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 交错字符串5. 两个字符串的最小ASCII和6. 最长重复子数组7. 通配符匹配 动态规划&#xff08;两个数组问题&#xff09; 1. 最长公共子序列 题目链接 状态表示 dp[i]…