最近一直在做以前的题,刷题量都没有怎么增长,感觉自己算法一直不太行,但也只能菜就多练了。
打卡记录
由子序列构造的最长回文串的长度(区间DP)
链接
第二次刷这道题,相比上回思路来的很快,但是对 if i < len(word1) <= j
的限制条件,依旧不是很会设立。
class Solution:
def longestPalindrome(self, word1: str, word2: str) -> int:
s = word1 + word2
n, ans = len(s), 0
f = [[0] * n for _ in range(n)]
for i in range(n - 1, -1, -1):
f[i][i] = 1
for j in range(i + 1, n):
if s[i] == s[j]:
f[i][j] = f[i + 1][j - 1] + 2
if i < len(word1) <= j:
ans = max(ans, f[i][j])
else:
f[i][j] = max(f[i][j - 1], f[i + 1][j])
return ans
阈值距离内邻居最少的城市(Floyd)
关于 Floyd 的最外层为 k k k 的解释:最外层的 k k k 是枚举位于起点和终点中的跳板,贪心的正确性必须得到保证,而这个保证在于,再求 f [ i ] [ j ] f[i][j] f[i][j] 时, f [ i ] [ k ] f[i][k] f[i][k] 和 f [ k ] [ j ] f[k][j] f[k][j] 若可达(一般来说把不可达设置为无穷大),必须为最优值(即最短距离)。
class Solution:
def findTheCity(self, n: int, edges: List[List[int]], distanceThreshold: int) -> int:
g = [[0x3f3f3f3f] * (n) for _ in range(n)]
for x, y, c in edges:
g[x][y] = g[y][x] = c
for k in range(n):
for i in range(n):
for j in range(n):
g[i][j] = min(g[i][j], g[i][k] + g[k][j])
ans = 0
min_cnt = inf
for i in range(n):
cnt = 0
for j in range(n):
if j != i and g[i][j] <= distanceThreshold:
cnt += 1
if cnt <= min_cnt:
min_cnt = cnt
ans = i
return ans