Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp
文章目錄
- 題目分析
- 狀態(tài)表示
- 狀態(tài)轉(zhuǎn)移
- 題目鏈接
題目分析
補(bǔ)充博弈論的做題想法:讓最壞情況下最好。在很多決策中,考慮所有的最壞情況,選其中最好的一個(gè)。
本題分析:
剛開(kāi)始因?yàn)槭莻€(gè)貪心題目,兩個(gè)人每次從兩側(cè)選擇最小的,這樣不是每個(gè)人不是最優(yōu)的嘛,結(jié)果發(fā)現(xiàn)不是。所以這不是一道貪心題。
本題是到區(qū)間dp的題目:
狀態(tài)表示
f[i][j]f[i ][j ]f[i][j]表示 當(dāng)前局面是 stones[i,j]stones[i, j]stones[i,j]的話,先手減后手的得分的最大值
答案是f[1,n]f[1,n]f[1,n]表示當(dāng)前局面是 stones[1,n]stones[1,n]stones[1,n]的話,先手減后手的得分的最大值
狀態(tài)轉(zhuǎn)移
下面分析狀態(tài)轉(zhuǎn)移:
對(duì)于 局面stones[i,j]stones[i, j]stones[i,j],先手A有兩種取法:
如果A先取 i :先手得分是s[i+1,j](其中s表示求和)s[i+1,j] (其中s表示求和)s[i+1,j](其中s表示求和),此時(shí)后手的局面是 stones[i+1,j]stones[i+1, j]stones[i+1,j],后手也是極端聰敏的人,會(huì)選擇對(duì)自己最有利的,此時(shí)對(duì)于B而言他是先手,他的最優(yōu)解是f[i+1,j]f[i+1,j]f[i+1,j],此時(shí)f[i+1,j]f[i+1,j]f[i+1,j]存的是B-A(先手- 后手)的最大值。
我們考慮Alice的 最壞情況,是什么呢? 就是A-B的最小值, 等價(jià)轉(zhuǎn)換就是 后手B的最大值,即f[i+1,j]f[i+1,j]f[i+1,j] 。所以A先選i 的話,最壞情況下的分值為是s[i+1,j]?f[i+1,j]是s[i+1,j]-f[i+1,j]是s[i+1,j]?f[i+1,j].
如果A先選j,同理,A的得分是s[i,j?1]s[i,j-1]s[i,j?1],此時(shí)后手局面是 stones[i,j?1]stones[i, j-1]stones[i,j?1],B的最優(yōu)解 f[i,j?1]f[i, j-1]f[i,j?1],A的最壞情況下得分就是s[i,j?1]?f[i,j?1]s[i,j-1]-f[i,j-1]s[i,j?1]?f[i,j?1]
總的情況是:先手A最壞情況要求最好,對(duì)上面兩個(gè)式子取max。
所以,狀態(tài)轉(zhuǎn)移方程:
f[i][j]=max(s(i+1,j)?f[i+1][j],s(i,j?1)?f[i][j?1])f[i][j] = max ( s(i+1,j)-f[i+1][j],s(i,j-1)-f[i][j-1])f[i][j]=max(s(i+1,j)?f[i+1][j],s(i,j?1)?f[i][j?1])
這里s為求和,可以使用前綴和優(yōu)化,如下代碼這里s為求和,可以使用前綴和優(yōu)化,如下代碼這里s為求和,可以使用前綴和優(yōu)化,如下代碼
ac代碼
class Solution { public:int stoneGameVII(vector<int>& stones) {int n=stones.size();vector<int> s(n+1); //前綴和數(shù)組:下標(biāo)從1開(kāi)始for(int i=1;i<=n;i++) s[i]=s[i-1]+stones[i-1];//因?yàn)閟tone下標(biāo)從0開(kāi)始vector<vector<int>> f(n+1,vector<int>(n+1)); //二維數(shù)組f大小//區(qū)間dp先枚舉區(qū)間長(zhǎng)度for(int len=2;len<= n ;len ++){//再枚舉左端點(diǎn)for(int i=1;i+len-1<=n;i++){int j=i+ len -1 ; //右端點(diǎn)f[i][j]= max(s[j] -s[i] - f[i+1][j], s[j-1]-s[i-1]-f[i][j-1]); //轉(zhuǎn)移}}return f[1][n];} };二維vector聲明大小請(qǐng)參考筆者另外一篇博客文章:二維vector的聲明和初始化
題目鏈接
Leetcode1690. 石子游戲 VII
總結(jié)
以上是生活随笔為你收集整理的Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二维vector的声明和初始化
- 下一篇: Leetcode1700. 无法吃午餐的