竞赛算法:区间动态规划

定义

子问题的转移形式是从小区间到大区间,而非前缀或后缀的转移

算法

例题:3563. 移除相邻字符后字典序最小的字符串

记忆化搜索

python
from functools import cache
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

参考

力扣第 452 场周赛
力扣第 451 场周赛
Valaxy v0.28.4 驱动|主题-Yunv0.28.5
本站总浏览量: -本站总访客数: -
本站已运行0 天0 小时0 分0 秒