日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp

發(fā)布時(shí)間:2025/4/5 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 題目分析
        • 狀態(tài)表示
        • 狀態(tài)轉(zhuǎn)移
    • 題目鏈接

題目分析

補(bǔ)充博弈論的做題想法:讓最壞情況下最好。在很多決策中,考慮所有的最壞情況,選其中最好的一個(gè)。

本題分析:
剛開始因?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[1n]的話,先手減后手的得分的最大值

狀態(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開始for(int i=1;i<=n;i++) s[i]=s[i-1]+stones[i-1];//因?yàn)閟tone下標(biāo)從0開始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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。