竞赛算法:区间动态规划

本文最后更新于 2 分钟前,文中所描述的信息可能已发生改变。

例题:3563. 移除相邻字符后字典序最小的字符串 - 力扣(LeetCode)

记忆化搜索

python
fair = lambda x, y: abs(ord(x) - ord(y)) == 1 or abs(ord(x) - ord(y)) == 25
@cache
def dfs(i, j):
	# s == ''
	if i > j:
		return True
	if fair(i, j) and dfs(i + 1, j - 1):
		return True
	# 步长为2
	for k in range(i + 1, j - 1, 2):
		if dfs(i, k) and dfs(k + 1, j):
			return True
	return False

递推

python
n = len(s)
fair = lambda x, y: abs(ord(x) - ord(y)) == 1 or abs(ord(x) - ord(y)) == 25

f = [[False] * n for _ in range(n)]
for i in range(n - 2, -1, -1):
	f[i + 1][i] = True

	for j in range(i + 1, n, 2):
		if fair(s[i], s[j]) and f[i + 1][j - 1]:
			f[i][j] = True
			continue
		for k in range(i + 1, j - 1, 2):
			if f[i][k] and f[k + 1][j]:
				f[i][j] = True
				break
python
n = len(s)
fair = lambda x, y: abs(ord(x) - ord(y)) == 1 or abs(ord(x) - ord(y)) == 25

f = [[False] * n for _ in range(n)]
for length in range(2, n + 1, 2):
	for i in range(n - l + 1):
		f[i + 1][i] = True
		j = i + length - 1
		if fair(s[i], s[j]) and f[i + 1][j - 1]:
			f[i][j] = True
			continue
		for k in range(i + 1, j - 1, 2):
			if f[i][k] and f[k + 1][j]:
				f[i][j] = True
				break
LeetCode Weekly Contest 452
LeetCode Weekly Contest 451