傳送門
這道題乍一看思路只有打個暴力。
題目要求:乙個格仔可以落子當且僅當這個格仔內沒有棋子且這個格仔的左側及上方的所有格仔內都有棋子,即棋子一定都分布在左上角。
也就是說塗了色的格仔的形狀一定是下面這樣的,我們考慮橫邊為1,豎邊為0,這個格仔的所有邊就是101010(沒包括其他邊界,只看藍色部分),考慮輪廓線做法
初始狀態為0000001111111,結束狀態為1111111000000
而關於雙方都選擇最優策略,我們可以這樣考慮,以a為標準,a想使得差值盡量大,b想使得差值盡量小,這是等價的。每次判斷是先手後手,分別取max和min就好
然後我們考慮如何狀態轉移,我們可以發現,走一步不過是01->10(可自己畫圖看一下),於是我們用3異或巧妙地進行處理。
我們是用dfs進行狀態的轉移的,而且是先遞迴到最後一層,再一層一層把貢獻累加回最初的狀態(這是比較重要的思想)
至於每一次位置的確定,是先y=m,x=1,從右上(其實就是輪廓線的末端)往回推(可以自己手動模擬一下,還是很巧妙的)
#include#define inf 2100000001ac#define n 12
using
namespace
std;
intread()
while(s>='
0'&&s<='9')
return x*f;
}int a[n][n],b[n][n],dp[4200000],used[4200000
],n,m;
int dfs(int sta,int who)//
先手1,後手0
if((sta>>i)&1) y--;//
相當於是沿著輪廓線回走,退到線內,為下一重迴圈準備
else x++;
}return
dp[sta];
}int
main()
九省聯考2018 一雙木棋
我們容易知道,棋子的擺放形狀應該是乙個階梯性 某dalao 來來來,輪廓線dp!我們選擇用狀態壓縮來表示整個棋盤的排放形態 11進製壓位,每個位上的數都表示一行的狀態 這樣子我們每次對合法狀態進行拓展,dfs搜尋下去。輪到菲菲,我們期望她的得分大一些,而到牛牛,我們期望她的得分少一些。所以我們對前者...
九省聯考2018 一雙木棋 chess
菲菲和牛牛在一塊n 行m 列的棋盤上下棋,菲菲執黑棋先手,牛牛執白棋后手。棋局開始時,棋盤上沒有任何棋子,兩人輪流在格仔上落子,直到填滿棋盤時結束。落子的規則是 乙個格仔可以落子當且僅當這個格仔內沒有棋子且這個格仔的左側及上方的所有格仔內都有棋子。棋盤的每個格仔上,都寫有兩個非負整數,從上到下第i ...
九省聯考2018 一雙木棋chess
據說這題是可以暴力踩過去的。還是考慮正解吧,是一種叫 輪廓線dp 的只聽過沒寫過的東西 不難發現,最後拿出來的棋子一定是左上角佔的一塊區域。發現 n m leq 20 我們可以狀壓一下這個區域右上到左下的邊界。具體來說,我們存乙個 2 以內的數,1 表示向下 0 表示向左。是否需要再開一維狀態維護當...