admin 發表於 2023-10-16 16:42:47

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

這是 L日本藤素,eetCode 上的 「877. 石子遊戲」 ,難度為 「中等」。

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

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

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

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

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

示例:

输入:
输出:true
诠释:
亚历克斯先起頭,只能拿前 5 颗或後 5 颗石子 。
假如他取了前 5 颗,這一行就酿成了 。
若是李拿走前 3 颗,那末剩下的是 ,亚历克斯拿走後 5 颗博得 10 分。
若是李拿走後 5 颗,那末剩下的是 ,亚历克斯拿走後 4 颗博得 9 分。
這表白,取前 5 颗石子對亚历克斯来讲是一個成功的行為,以是咱們返回 true 。
「界说f為斟酌區間,在两邊都做最佳選擇的环境下,先手與背工的最大得分差值為几多。」

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

piles - f \\

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

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

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

代码:

class Solution {
public boolean stoneGame(int[] ps) {
int n = ps.length;
int[][] f = new int;
for (int len = 1; len <= n; len++) { // 罗列區間长度
for (int l = 1; l + len - 1 <= n; l++) { // 罗列左端點
支票借錢,             int r = l + len - 1; // 计较右端點
西梅荷葉汁, int a = ps - f;
int b = ps - f;
f = Math.max(a, b);
}
}
return f > 0;
}
}
究竟上,這仍是一道很經典的博弈论問题,也是最简略的一類博弈论問题。

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

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

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

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

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

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

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

代码:

class Solution {
pu抗皺眼霜,blic boolean stoneGame(int[] piles) {
return true;
}
}
這是咱們「刷穿 LeetCode」系列文章的第 No.877 篇,系列起頭于 2021/01/01,截止于肇端日 LeetCode 上共有 1916 道标题,部門是有锁题,咱們将先将所有不带锁的标题刷完。

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

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

在堆栈地點里,你可以看到系列文章的题解链接、系列文章的响應代码、LeetCode 原题链接和其他优選题解。
頁: [1]
查看完整版本: 經典區間 DP & 經典博弈遊戲