文章目录

  • 1. 背
  • 2. 题目
  • 3. 答案

1. 背

首先,考虑没有环的情况。如果没有环这道题可以转变为和打家劫舍II一毛一样。但是明明这道题是三块披萨一拿啊,打家劫舍是相邻不能拿,还是不一样啊。

这块证明挺难的,但是我可以用个简单的例子。例如008080,这种情况我能拿到16的披萨,因为我把第一个0拿走后,就变成了0空空空80,此时我再拿8,aclice可以拿前面那个0,也是能办到的。

反正最终的结果就是只要两个不相邻就行。

dp[i][j]表示前i个数字中,选择j个数字时的最大值。dp的行就是slice数组的长度,即元素的个数。dp的列就是行除以3(即能拿几次披萨)。不过,不过哈,写代码不能这么定义行列的长度,后面再说。
因此dp[i][j] = max(dp[i-2][j-1]+slices[i],dp[i-1][j]),如果选择第i个元素,那么i-1就不能选,就得选i-2,如果不选i,必须选好j个数字,因此就是dp[i-1][j]。

那么有环怎么办,还和打家劫舍II一样,判断[0,n-2]和[1,n-1]。问题又来了,传入的明明时3的倍数,我手动删掉一个,还能是3的倍数吗?不是的话肯定有影响,但是因为影响的是其他人的结果,但是题目只问我能拿多少披萨。

最后一个问题,上面说了dp数组的横纵长度不能直接用数组长度啥的表示,答案是这样的,它们把横纵坐标长度都加了一,原因很简答,保证数组从1开始。注意dp的定义“前i个数字中,选择j个数字时的最大值”,前0个数字不好处理,所以变成前1个数字。

2. 题目

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

你挑选 任意 一块披萨。
Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。
Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨。
重复上述过程直到没有披萨剩下。
每一块披萨的大小按顺时针方向由循环数组 slices 表示。

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

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

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

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

3. 答案

class Solution {
public:int maxSizeSlice(vector<int>&slices){int row = static_cast<int>(slices.size());int col = (row+1)/3;vector<vector<int>>dp(row+1,vector<int>(col+1,0));for(int i=1;i<=row;++i){for(int j=1;j<=col;++j){auto num1 = (i-2>=0&&j-1>=0?dp[i-2][j-1]:0)+slices[i-1];auto num2 = i-1>=0?dp[i-1][j]:0;dp[i][j] = max(num1,num2);}}return dp[row][col];}int maxSizeSlices(vector<int>& slices) {vector<int>a1(slices.begin(),slices.end()-1);vector<int>a2(slices.begin()+1,slices.end());auto num1 = maxSizeSlice(a1);auto num2 = maxSizeSlice(a2);return max(num1,num2); }
};

1388. 3n 块披萨相关推荐

  1. 【2021春招】2021年阿里笔试真题3.6/3.8/3.10/3.12记录

    少壮不努力,老大徒伤悲! ali 2021.3.6 1411. 给 N x 3 网格图涂色的方案数 815. 公交路线 1 你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之 ...

  2. 贪心(Greedy Algorithm)

    贪心(Greedy Algorithm) 贪心 44.通配符匹配 45.跳跃游戏 II 55.跳跃游戏 122.买卖股票的最佳时机II 134.加油站 135.分发糖果 179.最大数 277.搜寻名 ...

  3. 如何学好C语言--你的学渣朋友告诉你

    光说不练假把式,光练不说傻把式,又练又说真把式. 真实感受,不是我不想学,是我真的不知道我哪里不会啊和得怎么做啊?本文作者当初就是这么废掉的 推荐两个练习的网站 (一)C语言网 https://www ...

  4. leetcode题目

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>Lee ...

  5. LeetCode 第 22 场双周赛(220/2041,前10.8%)

    文章目录 1. 比赛结果 2. 题目 LeetCode 5348. 两个数组间的距离值 easy LeetCode 5349. 安排电影院座位 medium LeetCode 5350. 将整数按权重 ...

  6. 动态规划(持续更新、整理)

    动态规划 记忆化搜索 不同路径:leetcode-62 分割回文串:leetcode-131 单词拆分II:leetcode-140 戳气球:leetcode-312 零钱兑换:leetcode-32 ...

  7. 切披萨n块需要几刀原理c语言,LeetCode 1444. 切披萨的方案数(DP)

    1. 题目 给你一个 rows x cols 大小的矩形披萨和一个整数 k ,矩形包含两种字符: 'A' (表示苹果)和 '.' (表示空白格子). 你需要切披萨 k-1 次,得到 k 块披萨并送给别 ...

  8. LeetCode 1444. 切披萨的方案数(DP)

    1. 题目 给你一个 rows x cols 大小的矩形披萨和一个整数 k ,矩形包含两种字符: 'A' (表示苹果)和 '.' (表示空白格子). 你需要切披萨 k-1 次,得到 k 块披萨并送给别 ...

  9. POJ 3122 分披萨(二分查找)

    题目链接:http://poj.org/problem?id=3122 题目大意: 有 n 块披萨(大小不一样), f 个人分,包含主人自己 f+1 人: 每人吃的披萨必须是一块披萨上切下来的.每个人 ...

最新文章

  1. AI人工智能-智能学习时代
  2. 使用Python在Selenium WebDriver中获取WebElement的HTML源代码
  3. spring+hibernate的配置
  4. 海豚浏览器发布双核版本 支持html5
  5. 求数组中各个元素的个数?
  6. Web Hacking 101 中文版 八、跨站请求伪造
  7. c语言快递信息系统有哪些信息,国内知名物流信息管理系统软件有哪些?分别是什么?...
  8. [Share]如何做好一份前端工程师的简历?
  9. 怎样使用摹客在线原型实现自动轮播图
  10. word2016如何在将指定页设置为首页
  11. MAML代码及理论的深度学习 PyTorch二阶导数计算
  12. 为什么中国没有诞生世界流行的编程语言?
  13. OpenWrt的USB网口驱动使用
  14. 基于微信小程序的校园信息共享平台 毕业设计-附源码211615
  15. skywalking本地配置探针 打TID
  16. 详细解释:Epoch、batch_size批处理大小、迭代次数之间的关系
  17. u盘固定盘符_浅析固定U盘盘符的原理
  18. Lesson 2 Thirteen equals one 十三等于一
  19. linux内核教学的全套视频,中科大老师全程讲解Linux内核分析视频教程《附加介绍+总结》共23节课...
  20. 百度搜狗360快速排名可以解决网站排名的哪些问题呢?

热门文章

  1. Qt使用QAxObject读写Excel 的方法
  2. Axure的入门到精通(一)——基础使用及常用快捷键
  3. jude(java建模软件)_JUDE(JAVA建模软件)
  4. 502粘到手上变硬了怎么办_502粘住手怎么办?502粘到手上变硬了怎么办
  5. 【实验】虚拟驱动模拟实验
  6. win10 werfault.exe 内存不能read 修复
  7. k武装匪徒强化学习入门课
  8. 父进程和子进程之间的关系
  9. A005:查找文件之find, locate, whereis, which, type
  10. 探索新时代的进货渠道突破口,快速脱颖而出