黑妹和黑弟又聚在一起玩遊戲了,這次他們選擇在乙個n*m的棋盤上玩遊戲,棋盤上的每個方格都有乙個非負的分數,
遊戲從左上角開始右下角結束,雙方交替的選擇乙個方格並獲得方格上相應的分數,一方選擇的方格必須在上一步另一方選擇的方格
的右邊或者下面,黑妹先開始。現在黑妹想知道,如果雙方都採取最優策略(最優策略是指雙方都希望最終自己的總分數減去對方的總分數最大),她的總分數減去黑弟的總分數會是多少?
第一行乙個整數t表示資料的組數。(1 ≤ t ≤ 20)對於每組資料:
第一行兩個整數n,m表示棋盤的規格。(1 ≤ n, m ≤ 500)
接下來n行每行m個整數aij表示方格對應的分數。()
對於每組資料輸出一行表示答案。示例1
複製
12 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 ...