给出一个字符串,现在Alice和Bob又在博弈。
两个人都有一个空字符串。
二者轮流选择拿走当前字符串的最左端或这最右端,然后拼接在自己串的首部。
Alice先手。
二者都发挥最佳实力,最后谁的串字典序大谁就赢。
字符串长度n,n为偶数,且长度不超过2000
">Letter Picking
Letter Picking
Created by LXC on Wed Aug 9 15:52:29 2023
https://codeforces.com/problemset/problem/1728/D
ranting: 1800
tag: constructive algorithms, dp, games, two pointers
problem
给出一个字符串,现在Alice和Bob又在博弈。
两个人都有一个空字符串。
二者轮流选择拿走当前字符串的最左端或这最右端,然后拼接在自己串的首部。
Alice先手。
二者都发挥最佳实力,最后谁的串字典序大谁就赢。
字符串长度n,n为偶数,且长度不超过2000
solution
经典博弈dp。但要注意的是这个每次拿字符要放在首位。
我们定义$f_{i,j}$为当前子字符串s[i...j]
让Alice先手,最后的胜负情况。如果为-1则Alice赢,0则平局,1则Bob赢。
我们先让Alice动手一次,然后Bob接着动手一次。那么他们的选取组合有四种:
- Alice选择
s[i]
,Bob选择s[i+1]
,子问题为$f_{i+2, j}$。其结果非0时,根据字典序的定义,s[i]
和s[i+1]
的大小关系已经不重要了,直接由$f_{i+2, j}$决定胜负;否则s[i]
和s[i+1]
的大小关系决定胜负。 - Alice选择
s[i]
,Bob选择s[j]
,子问题为$f_{i+1, j-1}$。 - Alice选择
s[j]
,Bob选择s[j-1]
,子问题为$f_{i, j-2}$。 - Alice选择
s[j]
,Bob选择s[i]
,子问题为$f_{i+1, j-1}$。
Alice有两中选择,Bob在Alice选完后也有两次选择。
Alice想要赢,Bob不想Alice赢,所以Bob会选择较大的状态值,而Alice会选择较小的状态值。
状态转移看代码。
code
1 |
|