牛客練習賽21 B 黑妹的遊戲II(博弈DP)

2021-08-21 03:31:27 字數 1211 閱讀 9219

黑妹和黑弟又聚在一起玩遊戲了,這次他們選擇在乙個n*m的棋盤上玩遊戲,棋盤上的每個方格都有乙個非負的分數,

遊戲從左上角開始右下角結束,雙方交替的選擇乙個方格並獲得方格上相應的分數,一方選擇的方格必須在上一步另一方選擇的方格

的右邊或者下面,黑妹先開始。現在黑妹想知道,如果雙方都採取最優策略(最優策略是指雙方都希望最終自己的總分數減去對方的總分數最大),她的總分數減去黑弟的總分數會是多少?

第一行乙個整數t表示資料的組數。(1 ≤ t ≤ 20)

對於每組資料:

第一行兩個整數n,m表示棋盤的規格。(1 ≤ n, m ≤ 500)

接下來n行每行m個整數aij表示方格對應的分數。()

對於每組資料輸出一行表示答案。
示例1

複製

1 

2 2

1 3

4 5

複製

2

#include#include#includeusing namespace std;

#define ll long long

ll dp[505][505], a[505][505];

int main(void)

for(i=n;i>=1;i--)

else if(i==n)

else if(j==m)

else

}} printf("%lld\n", dp[1][1]);

} return 0;

}

解法二:思想一樣只不過更簡便。

#include #include #include#includeusing namespace std;

int n, m;

const int maxn = 507;

int dp[maxn][maxn], a[maxn][maxn];

int main()

memset(dp, 999, sizeof(dp));

for(int i = n; i > 0; i--)

for(int j = m; j > 0; j--)

dp[i][j] = min(a[i][j]-dp[i+1][j], a[i][j]-dp[i][j+1]);

}printf("%d\n", dp[1][1]);

}return 0;

}

**:

牛客練習賽21 B 黑妹的遊戲II

有乙個n m的棋盤,每格仔有非負分數,黑妹先手,每次只能下上乙個人選擇的方格的右方或者下方,黑妹和黑弟都在知道最優策略的情況下,從左上角開始到右下角結束,求黑妹最後獲得的分數減去黑弟的分數差是多少。我們由黑妹先手可得,黑妹一定可以獲得左上角和右下角的分數,我們採用逆向dp的思路。dp i j m i...

牛客練習賽21 黑妹的遊戲 記憶化搜尋

傳送門 非常典型的記憶化搜尋博弈 定義f i j f i j f i j 為從 i,j i,j i,j 開始造成的差值大小 先手 後手 那麼先手希望這個值大,後手希望小 就在各自的回合取max maxma x或取min minmi n即可 include using namespace std in...

牛客練習賽4 B

思維題,把 i2 j2 ai2 aj2 絕對值符號去掉後,我們設i2 j2 ai2 aj2 j2 i2 aj2 ai2 j2 aj2 i2 ai2 或者 i2 j2 ai2 aj2 j2 i2 aj2 ai2 ai2 i2 aj2 j2 原式化簡後只有這兩種形式,那麼我們可以設定兩個陣列a n b ...