除數博弈(動態規劃)

愛麗絲和鮑勃一起玩游戲,他們輪流行動。愛麗絲先手開局。

最初,黑板上有一個數字?n?。在每個玩家的回合,玩家需要執行以下操作:

  • 選出任一?x,滿足?0 < x < n?且?n % x == 0?。
  • 用?n - x?替換黑板上的數字?n?。

如果玩家無法執行這些操作,就會輸掉游戲。

只有在愛麗絲在游戲中取得勝利時才返回?true?。假設兩個玩家都以最佳狀態參與游戲。

示例 1:

輸入:n = 2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無法進行操作。

示例 2:

輸入:n = 3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,然后愛麗絲無法進行操作

數學歸納法:

class Solution {
public:bool divisorGame(int n) {return n%2==0;  }
};

數學歸納法的核心是:

  1. 基礎步:驗證?n?取最小的幾個值時猜想成立;
  2. 歸納步:假設?n ≤ k?時猜想成立,證明?n = k+1?時猜想也成立。
1. 基礎步:n=1 和 n=2 時結論成立
  • n=1(奇數):1 沒有小于自身的因數(無法操作),先手必敗(符合猜想)。
  • n=2(偶數):2 的因數是 1,先手減去 1 后剩 1,后手無法操作,先手必勝(符合猜想)。
2. 歸納步:假設 n≤k 時成立,證明 n=k+1 時成立

分兩種情況討論?k?的奇偶性(因為?k?和?k+1?奇偶性相反):

情況 1:k 是偶數 → k+1 是奇數
  • n = k+1?是奇數,其所有因數?x?必為奇數(奇數的因數都是奇數)。
  • 先手(Alice)必須減去一個奇數?x,剩余數為?(k+1) - x
    • 奇數減奇數 = 偶數,且?(k+1) - x ≤ k(因為?x ≥ 1)。
    • 根據歸納假設(n ≤ k?時成立),偶數必為必勝態,此時輪到后手(Bob)面對偶數,Bob 必勝。
  • 結論:n=k+1(奇數)時,Alice 必敗(符合猜想)。
情況 2:k 是奇數 → k+1 是偶數
  • n = k+1?是偶數,其因數?x?可以是奇數或偶數。
  • 先手(Alice)可以選擇減去一個奇數?x,剩余數為?(k+1) - x
    • 偶數減奇數 = 奇數,且?(k+1) - x ≤ k(因為?x ≥ 1)。
    • 根據歸納假設(n ≤ k?時成立),奇數必為必敗態,此時輪到后手(Bob)面對奇數,Bob 必敗。
  • 結論:n=k+1(偶數)時,Alice 可以通過選擇合適的?x?讓 Bob 必敗,因此 Alice 必勝(符合猜想)。

最終結論

通過數學歸納法,證明了 “偶數時先手必勝,奇數時先手必敗” 的猜想成立。

本質邏輯:奇數的因數都是奇數,操作后必然留下偶數(給對手必勝態);而偶數可以通過減去奇數留下奇數(給對手必敗態),因此奇偶性直接決定了勝負。

動態規劃:?

class Solution {
public:bool divisorGame(int n) {// 創建一個布爾類型數組R,大小為n,用于記錄每個數字的先手狀態// R[i]表示:當數字為i時,當前玩家(先手)是否能獲勝(true為勝,false為敗)vector<bool> R(n, false);// 基礎情況:// 當數字為1時,沒有小于1的因數,先手無法操作,必敗R[1] = false;// 當數字為2時,先手可以取因數1,剩余1給對手(對手必敗),因此先手必勝R[2] = true;// 從數字3開始,依次推遞推計算每個數字的勝負狀態for(int i = 3; i < n + 1; i++) {// 枚舉當前數字i的所有可能因數j(1 ≤ j < i)for(int j = 1; j < i; j++) {// 核心判斷:// 1. j必須是i的因數(i % j == 0)// 2. 取走j后,剩余數字i-j對應的狀態為必敗(!R[i-j])// 如果存在這樣的j,說明當前玩家可以通過取j讓對手陷入必敗態,因此當前玩家必勝if(i % j == 0 && !R[i - j]) {R[i] = true;  // 標記當前數字i為必勝態break;        // 找到一個有效j即可,無需繼續枚舉}}}// 返回數字n對應的先手狀態(是否必勝)return R[n];}
};

?

通過定義狀態?f[i]?記錄 “當前數字為?i?時,先手是否必勝”,再從基礎情況遞推到更大的?i

1. 狀態定義
  • f[i] = true:當數字為?i?時,先手必勝
  • f[i] = false:當數字為?i?時,先手必敗
2. 遞推邏輯(核心)

對于數字?i,先手的勝負取決于其所有可能的下一步操作:

  • 先手可以選擇?i?的任意一個因數?j0 < j < i),將數字變為?i-j(此時輪到后手操作,后手面對的狀態是?f[i-j]);
  • 如果存在至少一個?j,使得?f[i-j] = false(即后手面對?i-j?時必敗),那么先手可以選擇這個?j,讓后手陷入必敗態,因此?f[i] = true(先手必勝);
  • 如果對于所有?j,都有?f[i-j] = true(即后手面對所有可能的?i-j?時都必勝),那么先手無論怎么操作都會讓后手必勝,因此?f[i] = false(先手必敗)。
3. 基礎情況(邊界條件)
  • f[0]:無意義(無法操作);
  • f[1]:數字 1 沒有小于自身的因數(j?不存在),先手無法操作,必敗 →?f[1] = false
  • f[2]:因數?j=1,操作后變為?2-1=1,此時后手面對?f[1]=false(必敗),因此?f[2] = true(先手必勝)。
4. 遞推過程(從前往后計算)

從?i=3?開始,依次計算?f[i]

  • 枚舉?i?的所有因數?j0 < j < i);
  • 對每個?j,檢查?f[i-j]?是否為?false
  • 只要存在一個?j?滿足?f[i-j] = false,則?f[i] = true;否則?f[i] = false

示例說明(以?i=3?為例)

  • i=3?的因數?j?為?1(因為?3?的因數是?1?和?3,但?j < 3,所以只有?j=1);
  • 操作后數字變為?3-1=2,此時后手面對?f[2] = true(后手必勝);
  • 由于所有可能的?j?對應的?f[i-j]?都是?true,因此?f[3] = false(先手必敗)。

本質邏輯

  • 博弈問題的核心是 “讓對手陷入必敗態”;
  • 動態規劃通過記錄每個狀態的勝負,將大問題拆解為小問題(i?的狀態依賴于更小的?i-j?的狀態);
  • 從基礎情況逐步遞推,最終可得到任意?n?對應的?f[n],即初始狀態下先手的勝負。

?

?

?

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

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

相關文章

一起學springAI系列一:初體驗

Spring AI是干嘛的官網最權威&#xff0c;直接粘貼&#xff1a;“Spring AI”項目旨在簡化那些包含人工智能功能的應用程序的開發過程&#xff0c;同時避免不必要的復雜性。AI相關領域的功能對python的支持是最好的&#xff0c;相關供應商在出了啥功能的時候&#xff0c;都會優…

Ext JS極速項目之 Coworkee

ExtJS Coworkee 是什么? Ext JS 的 Coworkee 是一個由 Sencha 官方提供的完整員工管理應用示例,旨在展示 Ext JS 框架在企業級應用開發中的能力。 在線試用的地址是: https://examples.sencha.com/coworkee/#home 頁面效果與布局 登錄頁面: 主頁效果 左右分區結構:左…

飛算科技:原創技術重塑 Java 開發,引領行業數智化新浪潮

在科技革新的浪潮中&#xff0c;飛算科技作為一家堅持自主創新的數字科技企業&#xff0c;同時也是國家級高新技術企業&#xff0c;正深耕互聯網科技、大數據、人工智能等前沿領域&#xff0c;為眾多企業的數字化與智能化轉型提供強勁動力。?飛算科技的成長軌跡&#xff0c;是…

cesium FBO(一)渲染到紋理(RTT)

一聽到三維的RTT&#xff08;Render To Texture&#xff09;&#xff0c;似乎很神秘&#xff0c;但從底層實現一看&#xff0c;其實也就那樣&#xff0c;設計API的哪些頂級家伙已經幫你安排的明明白白了&#xff0c;咱們只需要學會怎么用就可以了。我認為得從WebGL入手&#xf…

PNP機器人機器人學術年會展示靈巧手動作捕捉方案。

2025年8月1-3日&#xff0c;第六屆中國機器人學術年會&#xff08;CCRS2025&#xff09;在長沙國際會議中心舉行&#xff0c;主題“人機共融&#xff0c;智向未來”。PNP機器人與靈巧智能聯合展出最新靈巧手模仿學習方案&#xff1a;基于少量示教數據即可快速復現復雜抓取動作&…

【45】C#入門到精通——C#調用C/C++生成動態庫.dll及C++ 生成動態庫.dll ,DllImport()方式導入 C++動態庫.dll方法總結

文章目錄1 C 生成動態庫.dll2 C#調用C/C生成動態庫.dll2.1 [DllImport()] 方式導入 C動態庫.dll2.2 調用測試3 C/C 生成通用dll,改進3.1改進后.h3.2 .cpp3.2 C# 調用4 [DllImport()] 方式導入C生成的 .dll 總結4.1 指定路徑導入4.2 .dll放在 執行目錄下&#xff08;一定要放對&…

從協議棧到ath12k_mac_op_tx的完整調用路徑

文章目錄 從協議棧到ath12k_mac_op_tx的完整調用路徑 1. 整體架構概覽 2. 詳細調用路徑分析 2.1 應用層到Socket層 2.2 協議層處理 2.3 網絡設備層到mac80211 2.4 mac80211發送入口 2.5 mac80211核心發送處理 2.6 mac80211發送核心處理 2.7 mac80211發送調度 2.8 最終驅動調用 …

WPFC#超市管理系統(4)入庫管理

入庫管理7. 商品入庫管理7.2 入庫實現顯示名稱、圖片、單位7.3 界面設計7.3 功能實現7. 商品入庫管理 數據庫中StockRecord表需要增加商品出入庫Type類型為nvarchar(50)。C#中的數據庫重新同步StockRecord表在Entity→Model中新建枚舉類型StockType namespace 超市管理系統.E…

CSS 打字特效

效果圖.wxml <view class"tips"><text>{{ tipsText }}</text><text class"tips-line">|</text> </view>.wxss .tips{padding: 50rpx 100rpx;font-size: 28rpx; } .tips-line{color: #ccc;animation: tips-line .5s al…

直播小程序 app 系統架構分析

一、引言 直播行業近年來發展迅猛&#xff0c;直播小程序和 APP 成為眾多用戶獲取直播內容以及主播進行內容輸出的重要平臺。一個完善且高效的系統架構是支撐直播業務穩定運行、提供優質用戶體驗的關鍵。本文將詳細剖析直播小程序 / APP 的系統架構&#xff0c;包括整體架構設計…

Vue常見題目

1. 什么是 Vue.js&#xff1f;它的核心特點是什么&#xff1f; Vue.js 是一個漸進式 JavaScript 框架&#xff0c;用于構建用戶界面。它的核心特點包括&#xff1a; - 響應式數據綁定 - 組件化開發 - 虛擬 DOM - 指令系統 - 輕量級且易于集成 - 豐富的生態系統&#xff08;Vue…

ipynb文件直接發布csdn

第一步&#xff0c;下載markdown文件 file --> save and export notebook as --> markdown第二步&#xff0c;導入markdown文件 進入csdn發布文章界面&#xff0c;點擊導入&#xff0c;選擇第一步下載的markdown文件即可

廣東省省考備考(第六十四天8.2)——判斷推理(重點回顧)

判斷推理&#xff1a;數量規律 錯題解析解析解析解析解析解析解析標記題解析解析解析解析解析解析解析今日題目正確率&#xff1a;53% 判斷推理&#xff1a;屬性規律 錯題解析解析解析解析解析解析標記題解析解析今日題目正確率&#xff1a;60%

【C++/STL】vector的OJ,深度剖析和模擬實現

vector在OJ中的使用 1.只出現一次的數字 class Solution { public:int singleNumber(vector<int>& nums) {int value 0;for(auto e : v) {value ^ e; }return value;} };2.楊輝三角 class Solution { public:vector<vector<int>> generate(int numRow…

衡石湖倉一體架構深度解構:統一元數據層如何破除數據孤島?

一、數據融合的世紀難題典型困境二、衡石統一元數據層設計架構核心關鍵技術實現智能元數據發現自動構建跨源血緣關系動態查詢重寫 將標準SQL翻譯為最優執行計劃text Original: SELECT SUM(sales) FROM virtual_view Rewritten: [S3] SELECT SUM(amount) FROM crm_sales [My…

Windows 下 fping 指令使用指南

fping 作為一款強大的網絡工具&#xff0c;能夠同時向多個主機發送 ICMP 回聲請求&#xff0c;相較于傳統的 ping 命令&#xff0c;在處理大量主機時具有顯著優勢。 一、fping 簡介? fping 是 “fast pinger” 的縮寫&#xff0c;它可以向一系列 IP 地址發送 ICMP 回聲請求。…

代碼隨想錄day52圖論3

文章目錄101. 孤島的總面積102. 沉沒孤島103. 水流問題104.建造最大島嶼101. 孤島的總面積 題目鏈接 文章講解 #include<bits/stdc.h> using namespace std;int ans 0; // 記錄不與邊界相連的孤島數量 int sum 0; // 當前孤島的面積 bool flag false; /…

linux pip/conda 修改默認cache位置

1 pip pip cache默認在/home/{username}目錄下&#xff0c;容易導致系統盤寫滿報錯。查看pip cache位置pip cache dir假設移動pip cache目錄到 /data/.cache/pip/cache&#xff0c;命令如下pip config set global.cache-dir /data/.cache/pip/cache2 conda 查看conda緩存位置c…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘seaborn’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘seaborn’問題 一、摘要 在使用 PyCharm 終端進行模塊安裝時&#xff0c;常常會遇到如下異常&#xff1a; ModuleNotFoundError: No module named ‘seaborn’…

(思維)洛谷 P13551 ももいろの鍵 題解

題意 愛莉給了你一個非負整數 nnn&#xff0c;你需要把 0,1,2,…,n0, 1, 2, \dots, n0,1,2,…,n 劃分成若干組&#xff0c;滿足每一組的按位與為 000。 劃分的組不需要相鄰。 你需要最大化劃分組數并給出方案。 1≤T≤6001 \le T \le 6001≤T≤600&#xff0c;0≤n≤1050 \le n…