每日一算:華為-批薩分配問題

題目描述

? ? ? ? "吃貨"和"饞嘴"兩人到披薩店點了一份鐵盤(圓形)披薩,并囑咐店員將披薩按放射狀切成大小相同的偶數個小塊。但是粗心的服務員將披薩切成了每塊大小都完全不同的奇數塊,且肉眼能分辨出大小。

? ? ? ?由于兩人都想吃到最多的披薩,他們商量了一個他們認為公平的分法:從"吃貨"開始,輪流取披薩。除了第一塊披薩可以任意選取外,其他都必須從缺口開始選。

他倆選披薩的思路不同。"饞嘴"每次都會選最大塊的披薩,而且"吃貨"知道"饞嘴"的想法。

問題:?已知披薩小塊的數量以及每塊的大小,求"吃貨"能分得的最大的披薩大小的總和。

解題思路

關鍵觀察:

  1. 圓形轉線性:吃貨第一步可以任意選擇,這會將圓形披薩變成線性數組
  2. 博弈策略:吃貨知道饞嘴總是選最大的,可以利用這個信息制定最優策略
  3. 動態規劃:后續變成經典的區間博弈問題

算法步驟:

  1. 枚舉吃貨第一塊的所有可能選擇
  2. 對于每種選擇,將剩余部分轉化為線性博弈問題
  3. 使用動態規劃求解最優策略
  4. 返回所有可能中的最大值

代碼實現/C++

#include <iostream>
#include <vector>
#include <algorithm>class PizzaGame {
private:// 解決線性數組的博弈問題// player: 0=吃貨, 1=饞嘴// 返回吃貨能獲得的最大收益int solveLinear(std::vector<int>& arr, int left, int right, int player,std::vector<std::vector<std::vector<int>>>& memo) {if (left > right) return 0;if (memo[left][right][player] != -1) {return memo[left][right][player];}int result;if (player == 0) { // 吃貨的回合// 吃貨選擇能讓自己最終收益最大的策略result = std::max(arr[left] + solveLinear(arr, left + 1, right, 1, memo),arr[right] + solveLinear(arr, left, right - 1, 1, memo));} else { // 饞嘴的回合// 饞嘴總是選最大的if (arr[left] >= arr[right]) {result = solveLinear(arr, left + 1, right, 0, memo);} else {result = solveLinear(arr, left, right - 1, 0, memo);}}return memo[left][right][player] = result;}public:int maxPizzaForChihuo(std::vector<int>& pizzaSizes) {int n = pizzaSizes.size();int maxResult = 0;// 枚舉第一塊披薩的選擇for (int start = 0; start < n; start++) {int currentResult = pizzaSizes[start];if (n > 1) {// 構建剩余的線性數組std::vector<int> remaining;for (int i = 1; i < n; i++) {remaining.push_back(pizzaSizes[(start + i) % n]);}// 初始化記憶化數組int remainSize = remaining.size();std::vector<std::vector<std::vector<int>>> memo(remainSize, std::vector<std::vector<int>>(remainSize, std::vector<int>(2, -1)));// 解決剩余的線性博弈問題(饞嘴先手)currentResult += solveLinear(remaining, 0, remainSize - 1, 1, memo);}maxResult = std::max(maxResult, currentResult);}return maxResult;}
};

?測試用例

int main() {PizzaGame game;// 測試用例1: [1, 3, 7, 5, 2]std::vector<int> pizza1 = {1, 3, 7, 5, 2};std::cout << "測試1: [1,3,7,5,2] -> " << game.maxPizzaForChihuo(pizza1) << std::endl;// 輸出: 11 (選擇7開始,然后得到7+2+1+1=11)// 測試用例2: [2, 1, 3, 4, 6, 5, 7]  std::vector<int> pizza2 = {2, 1, 3, 4, 6, 5, 7};std::cout << "測試2: [2,1,3,4,6,5,7] -> " << game.maxPizzaForChihuo(pizza2) << std::endl;// 測試用例3: [10, 1, 2, 3, 4]std::vector<int> pizza3 = {10, 1, 2, 3, 4};std::cout << "測試3: [10,1,2,3,4] -> " << game.maxPizzaForChihuo(pizza3) << std::endl;// 輸出: 14 (選擇10開始,然后得到10+4=14)return 0;
}

?復雜度分析

  • 時間復雜度:?O(n3)

    • 外層枚舉起點:O(n)
    • 內層動態規劃:O(n2)
    • 總體:O(n3)
  • 空間復雜度:?O(n2)

    • 記憶化數組空間

解題要點

關鍵洞察:

  1. 圓形特殊性:第一步可以任意選擇,將圓形轉化為線性問題
  2. 對手策略:利用已知的對手貪心策略制定最優方案
  3. 狀態轉移:區間DP的經典應用

易錯點:

  • 忘記考慮圓形數組的環形特性
  • 沒有正確處理博弈雙方的不同策略
  • 邊界條件處理不當

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92561.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92561.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Transfusion,Show-o and Show-o2論文解讀

目錄 一、Transfusion 1、概述 2、方法 二、Show-o 1、概述 2、方法 3、訓練 三、Show-o2 1、概述 2、模型架構 3、訓練方法 4、實驗 一、Transfusion 1、概述 Transfusion模型應該是Show系列&#xff0c;Emu系列的前傳&#xff0c;首次將文本和圖像生成統一到單…

聊聊 Flutter 在 iOS 真機 Debug 運行出現 Timed out *** to update 的問題

最近剛好有人在問&#xff0c;他的 Flutter 項目在升級之后出現 Error starting debug session in Xcode: Timed out waiting for CONFIGURATION_BUILD_DIR to update 問題&#xff0c;也就是真機 Debug 時始終運行不了的問題&#xff1a; 其實這已經是一個老問題了&#xff0c…

《R for Data Science (2e)》免費中文翻譯 (第1章) --- Data visualization(2)

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn …

【機器學習【9】】評估算法:數據集劃分與算法泛化能力評估

文章目錄一、 數據集劃分&#xff1a;訓練集與評估集二、 K 折交叉驗證&#xff1a;提升評估可靠性1. 基本原理1.1. K折交叉驗證基本原理1.2. 邏輯回歸算法與L22. 基于K折交叉驗證L2算法三、棄一交叉驗證&#xff08;Leave-One-Out&#xff09;1、基本原理2、代碼實現四、Shuff…

CodeBuddy三大利器:Craft智能體、MCP協議和DeepSeek V3,編程效率提升的秘訣:我的CodeBuddy升級體驗之旅(個性化推薦微服務系統)

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在堅不欲說&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 歡迎關注&#xff1a;&#x1f44d;點贊??留言收藏&#x1f680; &#x1f340;歡迎使用&#xff1a;小智初學計…

Spring Boot 整合 Redis 實現發布/訂閱(含ACK機制 - 事件驅動方案)

Spring Boot整合Redis實現發布/訂閱&#xff08;含ACK機制&#xff09;全流程一、整體架構二、實現步驟步驟1&#xff1a;添加Maven依賴<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

Sklearn 機器學習 線性回歸

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Sklearn 機器學習線性回歸實戰詳解 線性回歸是機器學習中最基礎也最經典的算法之一,…

AJAX案例合集

案例一&#xff1a;更換網站背景JS核心代碼<script>document.querySelector(.bg-ipt).addEventListener(change, e > {//選擇圖片上傳&#xff0c;設置body背景const fd new FormData()fd.append(img, e.target.files[0])axios({url: http://hmajax.itheima.net/api/…

vscode環境下c++的常用快捷鍵和插件

本文提供一些能夠在vscode的環境下&#xff0c;提高c代碼書寫效率的快捷鍵&#xff0c;插件以及設置等等。 快捷鍵ctrlshiftx&#xff1a; 彈出插件菜單ctrlshiftp&#xff1a;彈出命令面板可以快捷執行一些常見命令插件安裝這個后&#xff0c;可以按住ctrl跳轉到方法的實現&am…

React + ts 中應用 Web Work 中集成 WebSocket

一、Web Work定義useEffect(() > {let webSocketIndex -1const websocketWorker new Worker(new URL(./websocketWorker.worker.ts?worker, import.meta.url),{type: module // 必須聲明模塊類型});//初始化WEBSOCKET&#xff08;多個服務器選擇最快建立連接…

RabbitMQ面試精講 Day 3:Exchange類型與路由策略詳解

【RabbitMQ面試精講 Day 3】Exchange類型與路由策略詳解 文章標簽 RabbitMQ,消息隊列,Exchange,路由策略,AMQP,面試題,分布式系統 文章簡述 本文是"RabbitMQ面試精講"系列第3天內容&#xff0c;深入解析RabbitMQ的核心組件——Exchange及其路由策略。文章詳細剖析…

深入解析Hadoop MapReduce Shuffle過程:從環形緩沖區溢寫到Sort與Merge源碼

MapReduce與Shuffle過程概述在大數據處理的經典范式MapReduce中&#xff0c;Shuffle過程如同人體血液循環系統般連接著計算框架的各個組件。作為Hadoop最核心的分布式計算模型&#xff0c;MapReduce通過"分而治之"的思想將海量數據處理分解為Map和Reduce兩個階段&…

Kafka MQ 消費者

Kafka MQ 消費者 1 創建消費者 在讀取消息之前,需要先創建一個KafkaConsumer對象。創建KafkaConsumer對象與創建KafkaProducer對象非常相似—把想要傳給消費者的屬性放在Properties對象里。本章后續部分將深入介紹所有的配置屬性。為簡單起見,這里只提供3個必要的屬性:boo…

人工智能——Opencv圖像色彩空間轉換、灰度實驗、圖像二值化處理、仿射變化

一、圖像色彩空間轉換&#xff08;一&#xff09;顏色加法1、直接相加1、直接相加2、調用cv.add()函數進行飽和操作 在OpenCV中進行顏色的加法&#xff0c;我們說圖像即數組&#xff0c;所以從數據類型來說我們可以直接用numpy的知識來進行直接相加&#xff0c;但是存在…

【JToken】JToken == null 判斷無效的問題

if (innerNode null) {continue; }Debug.Log($"toNode type: {node["toNode"]?.GetType()}");發現這個JToken 無法正確的判斷 是否為 null&#xff0c;再排除邏輯問題后&#xff0c;我基本能確定的是 這個對象 不返回的不是真正的C# NULL 輸出類型后是 N…

C++基于libmodbus庫實現modbus TCP/RTU通信

今天看到了一個參考項目中用到了modbus庫&#xff0c;看著使用很是方便&#xff0c;于是記錄一下。后面有時間了或者用到了再詳細整理。 參考&#xff1a;基于libmodbus庫實現modbus TCP/RTU通信-CSDN博客 一、介紹 1.1庫文件包含 1.2最簡單的使用 本人在QT6.5下&#xff0…

【原創】微信小程序添加TDesign組件

前言 TDesign 是騰訊公司推出的一款UI界面庫,至于騰訊的實力嘛,也不用多說了。 官網:https://tdesign.tencent.com/ 源碼:https://github.com/Tencent/tdesign 目前處于活躍狀態,發文前5日,該庫仍在更新中… 遇到的問題 雖然騰訊為微信小程序開發提供了一個討論的論壇,…

Vue的路由模式的區別和原理

路由模式 Vue 的路由模式指的是 Vue Router 提供的 URL 處理方式&#xff0c;主要有兩種&#xff1a;Hash 模式和History 模式。 Hash模式 在 Vue Router 中&#xff0c;默認使用的是 hash 模式&#xff0c;即 mode: hash。如果想要使用 history 模式&#xff0c;可以設置 mode…

通過TPLink路由器進行用戶行為審計實戰

用戶行為審計是指對用戶在網絡平臺上的行為進行監控和記錄&#xff0c;以便對其行為進行分析和評估的過程。隨著互聯網的普及和發展&#xff0c;用戶行為審計在網絡安全和數據隱私保護方面起到了重要的作用。 用戶行為審計可以幫助發現和預防網絡安全威助。通過對用戶的行為進行…

MYSQL 第一次作業

新建產品庫mysql> CREATE DATABASE mydb6_product;使用產品庫mysql> USE mydb6_product;創建employess表mysql> CREATE TABLE employees (-> id INT PRIMARY KEY,-> name VARCHAR(50) NOT NULL,-> age INT,-> gender VARCHAR(10) NOT NULL DEFAULT unknow…