全台最大網路博奕遊戲論壇

 找回密碼
 立即註冊
搜索
熱搜: 活動 交友 discuz
查看: 407|回復: 0
打印 上一主題 下一主題

經典區間 DP & 經典博弈遊戲

[複製鏈接]

1622

主題

1622

帖子

4890

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
4890
跳轉到指定樓層
樓主
發表於 2023-10-16 16:42:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是 L日本藤素,eetCode 上的 「877. 石子遊戲」 ,難度為 「中等」

Tag : 「區間 DP」、「博弈论」

亚历克斯和李用几堆石子在做遊戲。偶数堆石子排成一行,每堆都有正整数颗石子 piles

遊戲以谁手中的石子至多来决出输赢。石子的总数是奇数,以是没有平手。

亚历克斯和李轮番举行,亚历克斯先起頭。 每回合,玩家從行的@起%Zy9s6%頭或竣%87rV7%事@處取走整堆石頭。 這類环境一向延续到没有更多的石子堆為止,此時手中石子至多的玩家获胜。

假如亚历克斯和李都阐扬出最好程度,当亚历克斯博得角逐時返回 true ,太陽能LED感應燈,当李博得角逐時返回 false 。

示例:

  1. 输入:[5,3,4,5]
  2. 输出:true
  3. 诠释:
  4. 亚历克斯先起頭,只能拿前 5 颗或後 5 颗石子 。
  5. 假如他取了前 5 颗,這一行就酿成了 [3,4,5] 。
  6. 若是李拿走前 3 颗,那末剩下的是 [4,5],亚历克斯拿走後 5 颗博得 10 分。
  7. 若是李拿走後 5 颗,那末剩下的是 [3,4],亚历克斯拿走後 4 颗博得 9 分。
  8. 這表白,取前 5 颗石子對亚历克斯来讲是一個成功的行為,以是咱們返回 true 。
複製代碼

「界说f[l][r]為斟酌區間[l,r],在两邊都做最佳選擇的环境下,先手與背工的最大得分差值為几多。」

那末 f[1][n]為斟酌所有石子,先手與背工的得分差值:

piles[r - 1] - f[l][r - 1] \\

两邊都想赢,城市做最优决议计划(即便本身與對方分差最大)。是以 f[l][r]為上述两种环境中的最大值。

按照状况转移方程,咱們發明大區間的状况值依靠于小區間的状况值,典范的區間 DP 問题。

台灣運彩官網,照從小到大「罗列區間长度」和「區間左端點」的通例做法举行求解便可。

代码:

  1. class Solution {
  2. public boolean stoneGame(int[] ps) {
  3. int n = ps.length;
  4. int[][] f = new int[n + 2][n + 2];
  5. for (int len = 1; len <= n; len++) { // 罗列區間长度
  6. for (int l = 1; l + len - 1 <= n; l++) { // 罗列左端點
  7. 支票借錢,             int r = l + len - 1; // 计较右端點
  8. 西梅荷葉汁, int a = ps[l - 1] - f[l + 1][r];
  9. int b = ps[r - 1] - f[l][r - 1];
  10. f[l][r] = Math.max(a, b);
  11. }
  12. }
  13. return f[1][n] > 0;
  14. }
  15. }
複製代碼

究竟上,這仍是一道很經典的博弈论問题,也是最简略的一類博弈论問题。

為了便利,咱們称「石子序列」為石子在原排序中的编号,下标從 1起頭。

因為石子的堆数為偶数,且只能從两頭取石子。「是以先手背工所能選擇的石子序列,彻底取决于先手每次决议。」

因為石子的堆数為偶数,對付先手而言:「每次的决议计划場合排場,都能「自由地」選擇奇数仍是偶数的序列,從而限定背工下一次「只能」奇数仍是偶数石子。」

详细的,對付本题,「因為石子堆数為偶数,是以先手的最起頭場合排場必定是[奇数, 偶数],即必定是「奇偶性分歧的場合排場」;当先手决议计划完以後,交到给背工的要末是[奇数,奇数]或[偶数,偶数],即必定是「奇偶性不异的場合排場」;背工决议计划完後,又規复「奇偶性分歧的場合排場」交回到先手」 ...

不難归纳推理,這個鸿沟是可以利用到每個回合。

「是以先手只必要在举行第一次操作前计较原序列中「奇数总和」和「偶数总和」哪一個大,然後每次决议计划都「限定」對方只能選擇「最优奇偶性序列」的對峙面便可。」

同時又因為所有石子总和為奇数,堆数為偶数,即没有平手,以是先手必胜。

代码:

  1. class Solution {
  2. pu抗皺眼霜,blic boolean stoneGame(int[] piles) {
  3. return true;
  4. }
  5. }
複製代碼

這是咱們「刷穿 LeetCode」系列文章的第 No.877 篇,系列起頭于 2021/01/01,截止于肇端日 LeetCode 上共有 1916 道标题,部門是有锁题,咱們将先将所有不带锁的标题刷完。

在這個系列文章内里,除讲授解题思绪之外,還會尽量给出最為简便的代码。若是触及通解還會响應的代码模板。

為了便利列位同窗可以或许電脑长進行調试和提交接码,我創建了相干的堆栈: 。

在堆栈地點里,你可以看到系列文章的题解链接、系列文章的响應代码、LeetCode 原题链接和其他优選题解。
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|全台最大網路博奕遊戲論壇  

保全i88, 運彩場中, 九州娛樂app, 歐冠盃歐冠盃投注, 歐冠盃決賽, 電話行銷, 汽車運輸車, 汽車貸款, 道路救援, ptt棒球5278 av

GMT+8, 2024-11-21 18:05 , Processed in 0.045631 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表