classSolution: @lru_cache(None) defpre(self, a, b): ifnotlen(a) + 1 == len(b): returnFalse idx = 0 while idx < len(a) and a[idx] == b[idx]: idx += 1 if a[idx:] == b[idx + 1:]: returnTrue returnFalse deflongestStrChain(self, words: List[str]) -> int: n = len(words) dp = [1] * n ret = 1 words = sorted(words, key=lambda x: len(x)) iflen(set([len(x) for x in words])) == 1: return1 for i inrange(1, n): for j inrange(i): if self.pre(words[j], words[i]): dp[i] = max(dp[i], dp[j] + 1) ret = max(ret, dp[i]); return ret
1049. Last Stone Weight II
这题和第一题的区别在于:可以选任意two
rocks。这样就从一个模拟题变成了一个dp题。
这题没有太多想法,去参考了 lee215 的解答。
基本的想法是:将这些数分为两组,求两组数之和的最小差值。这就是一个简单的背包问题了。
(这个问题转换就非常巧妙…使用集合可以很轻松地完成这些操作...)
1 2 3 4 5 6
classSolution: deflastStoneWeightII(self, stones: List[int]) -> int: dp, s = {0}, sum(stones) for stone in stones: dp = {x + stone for x in dp} | {x - stone for x in dp} returnmin([abs(x) for x in dp])